题意
求[1,n!]内有多少个数与m!互质
n,m<=10000000
分析
这么弱的题我居然都没想到。。。
首先肯定满足若x与m!互质,则x+m!和x-m!必然也与m!互质,那么答案就是
ϕ(m!)∗n!/m!
剩下乱搞即可。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define N 10050005
#define LL long long
using namespace std;
int jc[N],tot,prime[N],s[N],MOD;
bool not_prime[N];
void get_prime(int n)
{
for (int i=2;i<=n;i++)
{
if (!not_prime[i]) prime[++tot]=i;
for (int j=1;j<=tot&&i*prime[j]<=n;j++)
{
not_prime[i*prime[j]]=1;
if (i%prime[j]==0) break;
}
}
}
int ksm(int x,int y)
{
int ans=1;
while (y)
{
if (y&1) ans=(LL)ans*x%MOD;
x=(LL)x*x%MOD;y>>=1;
}
return ans;
}
void prework()
{
get_prime(10005000);
s[0]=1;
for (int i=1;i<=tot;i++)
s[i]=(LL)s[i-1]*ksm(prime[i],MOD-2)%MOD*(prime[i]-1)%MOD;
jc[0]=1;
for (int i=1;i<=10000000;i++) jc[i]=(LL)jc[i-1]*i%MOD;
}
int main()
{
int T;
scanf("%d%d",&T,&MOD);
prework();
while (T--)
{
int n,m;
scanf("%d%d",&n,&m);
int w=upper_bound(prime+1,prime+tot+1,m)-prime-1;
printf("%d\n",(LL)s[w]*jc[n]%MOD);
}
return 0;
}