luogu P1445 [Violet]嘤F♂A
博主决定更博文啦
这道题一开始没什么思路啊qwq
要求 \(\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}\) 的正整数解总数
首先通分,得 $$\frac{x+y}{xy}=\frac{1}{n!}$$
然后移项,得 $$n!(x+y)=xy$$
↑止步于此↑ $$n!(x+y)-xy=0$$
这里令\(y=n!+k(k\in N^*)\),因为由原方程得出\(y\)是大于\(n!\)的
原方程变为 $$n!(x+(n!+k))-x(n!+k)=0$$ $$(n!)^2+xn!+kn!-xn!-xk=0$$ $$xk-kn!=(n!)^2$$ $$k(x-n!)=(n!)^2$$ $$x=\frac{(n!)^2}{k}+n!$$
我们发现\(x,y\)一一对应废话
且\(x\)为正整数
所以\(k\)为\((n!)^2\)的约数
所以答案就是\((n!)^2\)的约数个数
思维僵化,这篇题解都是看别的大佬题解写的orz
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<ctime>
#include<queue>
#include<map>
#define LL long long
#define il inline
#define re register
using namespace std;
const LL mod=1000000007;
il LL rd()
{
re LL x=0,w=1;re char ch;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int prm[200010],pp[1000010],tt,n; //pp为某个数的最小质因子
LL ans=1,an[1000010];
int main()
{
n=rd();
for(int i=2;i<=n;i++)
{
if(!pp[i]) pp[i]=i,prm[++tt]=i;
for(int j=1;j<=tt&&i*prm[j]<=n;j++)
{
pp[i*prm[j]]=prm[j];
if(i%prm[j]==0) break;
}
int x=i;
while(x>1)
{
++an[pp[x]];
x/=pp[x];
}
}
for(int i=1;i<=n;i++) ans=(ans*((an[i]<<1)|1))%mod;
printf("%lld\n",ans);
return 0;
}