本文主要是介绍bzoj 2186 [Sdoi2008]沙拉公主的困惑 欧拉函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
n>=m,所以就变成了求
ϕ(m!)∗n!/m!
而
ϕ(m!)=m!∗(p−1)/p......
p为m!的素因子,即为m内的所有素数,问题就转化为了求
n!∗(p−1)/p......
只需要预处理出素数,阶乘,逆元即可
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define N 10000001
using namespace std;
bool bo[N+100];
long long prime[700000],fc[N+100],ans[N+100],ny[N+100];
int tot,T,n,m,p;
void init(){fc[1]=1;for(int i=2;i<=N;i++)fc[i]=(fc[i-1]*i)%p;for(int i=2;i<=N;i++){if(!bo[i])prime[++tot]=i;for(int j=1;j<=tot&&i*prime[j]<=N;j++){bo[i*prime[j]]=1;if(!i%prime[j])break;}}ny[1]=1;for(int i=2;i<=N&&i<p;i++)ny[i]=(p-p/i)*ny[p%i]%p;ans[1]=1;for(int i=2;i<=N;i++){if(!bo[i])ans[i]=ans[i-1]*(i-1)%p*ny[i%p]%p;else ans[i]=ans[i-1];}
}
int main(){scanf("%d%d",&T,&p);init();//printf("tot==%d\n",tot);while(T--){scanf("%d%d",&n,&m);printf("%d\n",(fc[n]*ans[m])%p);}return 0;
}
这篇关于bzoj 2186 [Sdoi2008]沙拉公主的困惑 欧拉函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!