[SDOI2008]沙拉公主的题目描述
(^ w ^)
大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票。房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量。现在,请你帮助沙拉公主解决这个问题,由于可能张数非常大,你只需计算出对R取模后的答案即可。R是一个质数。
输入输出格式
输入格式:
第一行为两个整数T,R。R<=10^9+10,T<=10000,表示该组中测试数据数目,R为模 后面T行,每行一对整数N,M,见题目描述 m<=n
输出格式:
共T行,对于每一对N,M,输出1至N!中与M!素质的数的数量对R取模后的值困惑
输入输出样例
输入样例#1:
1 11
4 2
输出样例#1:
1
数据范围:
对于100%的数据,1 < = N , M < = 10000000
由于我们可以把n!均分为
n
!
m
!
\ \frac{n!}{m!}
m!n! 段,每段与n!互质的个数为
φ
(
m
!
)
\ \varphi(m!)
φ(m!) 个。
所以答案为:
a n s = n ! m ! φ ( m ! ) ans = \frac{n!}{m!} \varphi(m!) ans=m!n!φ(m!)
化简得
a n s = n ! m ! m ! ∏ p ∣ m ( p − 1 ) p = n ! ∏ p ∣ m ( p − 1 ) ∏ p ∣ m p ans= \frac{n!}{m!} m! \prod_{p|m} \frac{(p-1)}{p}= n! \frac{\prod_{p|m}(p-1)}{\prod_{p|m}p} ans=m!n!m!p∣m∏p(p−1)=n!∏p∣mp∏p∣m(p−1)
所以只需要求得n!的逆元,
∏
p
∣
m
(
p
−
1
)
\ \prod_{p|m}(p-1)
∏p∣m(p−1)的逆元和
∏
p
∣
m
p
\ \prod_{p|m}p
∏p∣mp的逆元即可,注意的是,
n
≥
R
\ n \ge R
n≥R 时n!应消去一个R,
m
≥
R
\ m \ge R
m≥R时
∏
p
∣
m
p
\ \prod_{p|m}p
∏p∣mp应消去一个R。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<iostream>
using namespace std;
int n,m,t,r;
int tot=0,p[1000010],ans[10000010],is[10000010],inv[10000010];
bool f[10000010];
void work()
{
is[0]=1;
is[1]=1;
inv[0]=1;
inv[1]=1;
ans[0]=1;
ans[1]=1;
int i=2,j=1;
while(i<=10000000)
{
is[i]=1LL*is[i-1]*i%r;
inv[i]=1LL*(r-r/i)*inv[r%i]%r;
if(!f[i]) p[++tot]=i;
j=1;
while((j<=tot)&&(i*p[j]<=10000000))
{
f[i*p[j]]=1;
if(i%p[j]==0) break;
++j;
}
++i;
}
i=2;
while(i<=10000000)
{
ans[i]=ans[i-1];
if(!f[i]) ans[i]=((((1LL*ans[i])*(i-1))%r)*inv[i])%r;
++i;
}
}
int main()
{
scanf("%d%d",&t,&r);
work();
while(t--)
{
scanf("%d%d",&n,&m);
printf("%lld\n",((1LL*is[n])*ans[m])%r);
}
return 0;
}
/*
1996年:东方灵异传(TOH1)
1997年:东方封魔录(TOH2)
1997年:东方梦时空(TOH3)
1998年:东方幻想乡(TOH4)
1998年:东方怪绮谈(TOH5)
2002年:东方红魔乡(TOH6)
2003年:东方妖妖梦(TOH7)
2004年:东方萃梦想(TOH7.5)
2004年:东方永夜抄(TOH8)
2005年:东方花映冢(TOH9)
2005年:东方文花帖(TOH9.5)
2007年:东方风神录(TOH10)
2008年:东方绯想天(TOH10.5)
2008年:东方地灵殿(TOH11)
2009年:东方星莲船(TOH12)
2009年:东方非想天则(TOH12.3)
2010年:东方文花帖DS(TOH12.5)
2010年:东方三月精(TOH12.8)
2011年:东方神灵庙(TOH13)
2013年:东方心绮楼(TOH13.5)
2013年:东方辉针城(TOH14)
2014年:弹幕天邪鬼(TOH14.3)
2014年:东方深秘录(TOH14.5)
2015年:东方绀珠传(TOH15)
2017年:东方凭依华(TOH15.5)
2017年:东方天空璋(TOH16)
*/
//写上这些RP++
总结
不错的综合题,考了很多数论的相关知识,需要熟练运用很多知识解决。
我写这道题的时候还不会求逆元。
不过有足够的前置知识后这道题就不是很难了。