【BZOJ2721】【洛谷P1145】樱花【数论,数学】
题目大意:
题目链接:
BZOJ:https://www.lydsy.com/JudgeOnline/problem.php?id=2721
洛谷:https://www.luogu.org/problemnew/show/P1445
求方程 的正整数解的组数
思路:
神题啊
以下内容大部分摘自 这里
先通分
交叉相乘
移项得
配方
令
由于,所以
所以总共的取值就是
枚举,把每个数字分解质因数就可以求出答案了。
代码:
#include <cstdio>
#define rr register
using namespace std;
typedef long long ll;
const int MOD=1e9+7,N=1e6+10;
int n,prime[N],m,v[N];
ll cnt[N],ans;
void find_prime(int k)
{
for (rr int i=2;i<=n;i++)
{
if (!v[i])
{
v[i]=i;
prime[++m]=i;
}
for (rr int j=1;j<=m;j++)
{
if (prime[j]>v[i]||prime[j]*i>n) break;
v[i*prime[j]]=prime[j];
}
}
}
int main()
{
scanf("%d",&n);
find_prime(n);
for (rr int i=1;i<=n;i++)
for(rr int j=i;j!=1;j/=v[j])
cnt[v[j]]++;
ans=1;
for (rr int i=1;i<=m;i++)
ans=(ans*(cnt[prime[i]]*2+1))%MOD;
printf("%d",ans);
return 0;
}