版权声明:若希望转载,在评论里直接说明即可,谢谢! https://blog.csdn.net/SSL_ZYC/article/details/82811573
题目大意:
题目链接:https://jzoj.net/senior/#main/show/5773
题目图片:
https://www.z4a.net/images/2018/09/22/Screenshot.md.png
https://www.z4a.net/images/2018/09/22/Screenshot-1.png
给出
,求
值为正整数时
的所有正整数解(
)。
思路:
40分做法:
直接暴力枚举
,输出符合要求的即可。
100分做法:
首先,我们要求的是
设
,那么就有
我们知道,
,所以
用乘法分配律脱括号
拆成两半
左边可以简化
一开始设了
,右边有一项就是
,所以我们可以把它简化成
右边约分得
我们知道,这个式子的值必须是个整数。我们设答案为整数
等号两边同时乘2得
那么由于
和1都是整数,所以就有
也是整数
当
为整数时,
就一定是
的因数,所以
就一定是
的因数!
那么我们就枚举
的因数
,当
为正整数(即
是奇数)时,
就是一个合法的解!
代码:
#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
#define N 2000100
#define ll long long
using namespace std;
ll n,a[N],d[N],sum,ans;
int main()
{
cin>>n;
for (ll i=1;i<=sqrt(n);i++) //求出n的所有因数
if ((n%i)==0)
{
if (i*i==n) d[++sum]=i;
else
{
d[++sum]=i;
d[++sum]=n/i;
}
}
for (ll i=1;i<=sum;i++)
{
if (((n/d[i])%2)&&n-d[i]) //符合要求
a[++ans]=n-d[i];
}
sort(a+1,a+1+ans);
cout<<ans;
for (int i=1;i<=ans;i++)
cout<<' '<<a[i];
return 0;
}