[Violet]樱花
作者:互联网
题目传送门
题目大意:
求解一个形如
\[\frac1x+\frac1y=\frac1{n!}\]
的方程正整数解\(x,y\)的个数。
显然$ x,y>n!$
那么我们可以设\(y=n!+d\)
则:
\[\frac1x+\frac1y=\frac1{n!}\]
\[xn!+yn!=xy\]
\[(x+y)n!=xy\]
\[(x+d+n!)n!=x(n!+d)\]
\[x=\frac{n!}d+n!\]
所以:我们要找\(x\)的正整数解,既要找出来正整数\(d\)使得\(x\)也是正整数。显然,这就是找\((n!)^2\)的所有正约数.
然后就暴力就好辣qwq
还有一个不知道叫什么名的定理就是一个数\(x\)的约数个数\(d=\)
把\(x\)质因数分解,写成
\[x=\Pi_{i=1}^{k}p_i^{c_i}\]
(p是质数,k是x的质因数个数,重复不计)
的形式。
那么,x的约数个数为
\[\Pi_{i=1}^{k}(c_i+1)\]
emmmmmm,我这种蒟蒻是肯定不会证的(大雾
Code
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
typedef long double ld;
const ll N = 1e6+1;
const ll inf = 2147483647;
const ll mod = 1e9+7;
const double eps = 1e-5;
ll n;
ll ans=1;
ll c[N],p[N];
ll vis[N],m[N];
int cnt;
inline void readx(ll &x)
{
x=0;
int s=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
s=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
x*=s;
}
inline void screen()
{
for(int i=2;i<=n;++i)
{
if(!vis[i])
{
p[++cnt]=i;
m[i]=cnt;
}
for(int j=1;j<=cnt&&p[j]*i<=n;++j)
{
vis[i*p[j]]=1;
m[i*p[j]]=j;// m[i] 表示 i 的最小质因子
if(i%p[j]==0) break;
}
}
}
inline void solve(int x)
{
while(x!=1)
{
++c[m[x]];
x/=p[m[x]];
}
}
int main()
{
readx(n);
screen();
for(int i=1;i<=n;++i)
solve(i);
for(int i=1;i<=N;++i)
if(c[i])
ans=ans*(c[i]*2+1)%mod;
printf("%lld\n",ans);
return 0;
}
标签:樱花,约数,ch,const,ll,Violet,正整数,include 来源: https://www.cnblogs.com/oierwyh/p/11342173.html