博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 2186 [Sdoi2008]沙拉公主的困惑
阅读量:6643 次
发布时间:2019-06-25

本文共 1453 字,大约阅读时间需要 4 分钟。

Description

  大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票。房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量。现在,请你帮助沙拉公主解决这个问题,由于可能张数非常大,你只需计算出对R取模后的答案即可。R是一个质数。

Input

第一行为两个整数T,R。R<=10^9+10,T<=10000,表示该组中测试数据数目,R为模后面T行,每行一对整数N,M,见题目描述 m<=n

Output

共T行,对于每一对N,M,输出1至N!中与M!素质的数的数量对R取模后的值

Sample Input

1 11
4 2

Sample Output

1
数据范围:
对于100%的数据,1 < = N , M < = 10000000
 
题解放黄学长博客了,毕竟我自己也没做出来
http://hzwer.com/5863.html
1 #include
2 #define ll long long 3 const int maxn=10000010; 4 int r,t,m,n,fac[maxn],ine[maxn],pri[maxn],cnt,ans[maxn]; 5 bool mark[maxn]; 6 void exgcd(int a,int b,int &x,int &y){ 7 if (b==0){ 8 x=1; 9 y=0;10 return;11 }12 exgcd(b,a%b,x,y);13 int t=x; x=y;y=t-(a/b)*y;14 }15 16 int getine(int t){17 int x,y;18 exgcd(t,r,x,y);19 return (x%r+r)%r;20 }21 22 void pre(){23 fac[1]=1; for (int i=2;i<=maxn;i++) 24 fac[i]=(ll)fac[i-1]*i%r;25 ine[1]=1;26 for (int i=2;i<=maxn;i++){27 if (!mark[i]) pri[++cnt]=i,ine[i]=getine(i);28 for (int j=1;pri[j]*i<=maxn&&j<=cnt;j++){29 mark[pri[j]*i]=1;30 if (i%pri[j]==0) break;31 }32 }33 ans[1]=1;34 for (int i=2;i<=maxn;i++){35 ans[i]=ans[i-1];36 if (!mark[i]) ans[i]=(ll)ans[i]*(i-1)%r*ine[i]%r;37 }38 }39 40 int main(){41 scanf("%d%d",&t,&r);42 pre();43 for (int i=0;i

 

转载于:https://www.cnblogs.com/wuminyan/p/5117391.html

你可能感兴趣的文章
java中this用法
查看>>
1.4 双向循环链
查看>>
遗留的问题,
查看>>
地址,
查看>>
RegexHelper(正则表达式)
查看>>
ORACLE中 schema 和 user 区别
查看>>
Redhat6.5使用centos yum源
查看>>
unity3d与web交互的方法
查看>>
寒假集训日志(三)——数论
查看>>
javascript正则表达式
查看>>
QDU68 UP UP UP!(最长上升子序列个数)
查看>>
ls常用参数
查看>>
MySQL简单查询详解-单表查询
查看>>
MVC音乐商店 - 第二部分:控制器
查看>>
SLF4J的使用
查看>>
爬取新闻列表
查看>>
HttpClientUtil 工具类 实现跨域请求数据
查看>>
S8-codelab02
查看>>
怎么看iOS human interface guidelines中的user control原则
查看>>
Mac OS10.11更新ruby,gem,安装cocoapods
查看>>