luogu P1445 [Violet]嘤F♂A
Posted smyjr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(kin 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
",ans);
return 0;
}
以上是关于luogu P1445 [Violet]嘤F♂A的主要内容,如果未能解决你的问题,请参考以下文章