[5773]簡單數學題 {數學}
阿新 • • 發佈:2018-12-11
題目
Description
話說, 小X是個數學大佬,他喜歡做數學題。有一天,小X想考一考小Y。他問了小Y一道數學題。題目如下: 對於一個正整數N,存在一個正整數T(0<T<N),使得的值是正整數。 小X給出N,讓小Y給出所有可能的T。如果小Y不回答這個神奇的大佬的簡單數學題,他學神的形象就會支離破碎。所以小Y求你幫他回答小X的問題。
Input
一個整數N。
Output
第一個數M,表示對於正整數N,存在M個不同的正整數T,使得是整數。 後面是M個數,每一個數代表可能的正整數T(按從小到大的順序排列)。
解題思路
我們可以假設 可知 代入原式得 用乘法分配律可得 假設式子的和為正整數約分可得 然後我們顯而易見的發現是的約數集合,我們僅需判斷N-xans$數組裡,排一個序。
程式碼
#include<cstdio>
#include<cmath>
#include<algorithm>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
using namespace std;
long long n,ans,t,a[10001],b[10001];
int main()
{
scanf("%lld",&n);
for (int i=1;i<=sqrt(n);i++)
if (n%i==0) {
if (i*i==n) b[++t]=i; else {b[++t]=i; b[++t]=n/i;}
}
for (int i=1;i<=t;i++)
if (b[i]!=n&&((n/b[i]+1)%2==0)) a[++ans]=n-b[i];
sort(a+1,a+ans+1);
printf("%lld",ans); if (ans>0)
{
for (int i=1;i<ans;i++) printf(" %lld",a[i]);
printf(" %lld",a[ans]);
}
}