版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 https://blog.csdn.net/qq_39897867/article/details/82814131
题目
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-x
ans$数组里,排一个序。
代码
#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]);
}
}