[SDOI2008]沙拉公主的困惑
Posted sshwy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[SDOI2008]沙拉公主的困惑相关的知识,希望对你有一定的参考价值。
求\(1\sim n!\)中与\(m!\)互质的数的个数。\(m\leq n\leq 10^7\).
显然\(m!|n!\)。根据GCD的性质,\((a,b)=(a+b,b)\),则\((a,m!)=(a+m!,m!)\)。于是每\(m!\)分一组,易得
\[
ans=\sum_i=1^n![(i,m!)=1]\=\fracn!m!\varphi(m!)=n!\prod\fracp_i-1p_i,p_i\leq m
\]
然后。就被开心地卡常了。
逆元要写递推的,而且还要避免多次取模。见代码。
循环尽量别合并。
#include<cstdio>
using namespace std;
const int N=1e7+5;
int t,r,n,m;
int vis[N],p[N/10],lp;
void sieve(int k)
vis[0]=vis[1]=1;
for(int i=2;i<=k;i++)
if(!vis[i])p[++lp]=i;
for(int j=1;j<=lp;j++)
if(i*p[j]>k)break;
vis[i*p[j]]=1;
if(i%p[j]==0)break;
int fac[N],inv[N],fp[N];//fac phi
int main()
scanf("%d%d",&t,&r);
sieve(1e7);
fac[0]=1;
for(int i=1;i<=10000000;i++)fac[i]=1ll*i*fac[i-1]%r;
inv[1]=1;
for(int i=2;i<=10000000;i++)inv[i]=(1ll*(r-r/i)*inv[r%i]%r);
fp[1]=1;
for(int i=2;i<=10000000;i++)
fp[i]=fp[i-1];
if(vis[i]==0)fp[i]=1ll*fp[i]*(i-1)%r*inv[i]%r;
while(t--)
scanf("%d%d",&n,&m);
printf("%lld\n",1ll*fac[n]*fp[m]%r);
return 0;
以上是关于[SDOI2008]沙拉公主的困惑的主要内容,如果未能解决你的问题,请参考以下文章
数学(逆元):BZOJ 2186: [Sdoi2008]沙拉公主的困惑