一本通OJ-不定方程

不定方程

题意

求方程:$$\dfrac{1}{x} + \dfrac{1}{y} = \dfrac{1}{n!}$$ 的正整数解的组数,答案对 \(10^9+7\) 取模。

分析

\(y=\frac{xn!}{x-n!}\)。设\(t=x-n!\)。那么\(y=n!+\frac{(n!)^2}{t}\)。所以\(t是(n!)^2\)的约数就可以。因为\(n!=p_{1}^{m_{1}}*p_{2}^{m_{2}}...*p_{n}^{m_{n}}\)。因而\((n!)^2=p_{1}^{2m_{1}}*p_{2}^{2m_{2}}...*p_{n}^{2m_{n}}\)。则\(ans=k=\prod\limits_{i=1}^n{2ci+1}\)

代码

#include<iostream>
#include<cstdio>
using namespace std;
long long n, q;
long long s[6001000], c[6001000];
bool b[100000001];
void p(long long n)
{
	for(long long i=2; i<=n; i++)
	{
		if(b[i]==0)
		{
			s[0]++;
			s[s[0]]=i;
		}
		for(long long j=1; j<=s[0]&&i*s[j]<=n; j++)
		{
			b[i*s[j]]=1;
			if(i%s[j]==0)
				break;
		}
	}
}
int main()
{
	scanf("%lld", &n);
	long long m=1e9+7;
	p(n);
	for(long long i=1; i<=s[0]; i++)
		for(long long j=s[i]; j<=n; j*=s[i])
			c[i]=(c[i]+n/j)%m;
	long long ans=1;
	for(long long i=1; i<=s[0]; i++)
		ans=ans*(c[i]*2+1)%m;
	printf("%lld", ans);
	return 0;
}
posted @ 2023-07-25 13:57  Zimo_666  阅读(8)  评论(0编辑  收藏  举报