题目大意:
题目链接: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;
}