标签:樱花 约数 ch const ll Violet 正整数 include
题目传送门
题目大意:
求解一个形如
\[\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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。