[SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉
来源:互联网 发布:爱动体感运动机 知乎 编辑:程序博客网 时间:2024/05/01 23:58
[SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉
题目大意
给定n,m,求在1到n!内与m!互质的个数,答案要对r取模。
输入格式:
第一行为两个整数T,R。R<=10^9+~~10,T<=10000,表示该组中测试数据数目,R为模 后面T行,每行一对整数n,m,见题目描述 m<=n
输出格式:
共T行,对于每一对N,M,输出1至N!中与M!素质的数的数量对R取模后的值
输入输出样例
input
1 11
4 2
output
1
解题分析
首先,我们来引出一个定理
如果a与b互质,那么
反过来,我们也可以用
因为
因为
根据这个特性,并且
我们可以得到式子
进一步拆开,我们可以得到 (假设p为m!的质因数,很容易可以知道,p就是所有小于m的素数,r为质因数个数)
因为
有多组询问,我们得先预处理一些数据,累乘的时候要%R
我们令
先预处理O()答案,对于询问O(1)出解
#include <cstdio>#include <iostream>#include <math.h>using namespace std;const int MAXN=10000000+10;bool su[MAXN];int q[MAXN][2],maxm,maxn,t,inv[MAXN],p,n,m;int k[MAXN],f1[MAXN],f2[MAXN],ans=0;void work(){ inv[1]=1;k[1]=1;f1[1]=1;f2[1]=1; for(int i=2;i<=sqrt(maxm);i++) if(!su[i]) for(int j=2;j<=maxm/i;j++) su[i*j]=1; for(int i=2;i<=maxn;i++) { if(i<=maxm) { inv[i]=(1LL*-(p/i)*inv[p%i])%p; inv[i]=(inv[i]%p+p)%p; } if(i<=maxm) { if(!su[i]) { f1[i]=(1LL*f1[i-1]*((i-1)%p))%p; f2[i]=(1LL*f2[i-1]*(inv[i]%p))%p; }else { f1[i]=f1[i-1]; f2[i]=f2[i-1]; } } k[i]=(1LL*k[i-1]*(i%p))%p; }}int main(){ scanf("%d%d",&t,&p); for(int i=1;i<=t;i++) { scanf("%d%d",&q[i][0],&q[i][1]); maxn=max(maxn,q[i][0]); maxm=max(maxm,q[i][1]); } work(); for(int i=1;i<=t;i++) { ans=((1LL*k[q[i][0]]%p)*1LL*(f1[q[i][1]]%p))%p; ans=(ans*1LL*(f2[q[i][1]]%p))%p; printf("%d\n",ans); } return 0;}/*2 116 310 5*/
- [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉
- 2186: [Sdoi2008]沙拉公主的困惑 线性筛素数+欧拉函数+乘法逆元
- BZOJ2186 [Sdoi2008]沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】
- bzoj 2186 [Sdoi2008]沙拉公主的困惑 欧拉函数
- 【BZOJ 2186】[Sdoi2008]沙拉公主的困惑 欧拉函数
- [BZOJ 2186][Sdoi2008]沙拉公主的困惑:欧拉函数
- bzoj 2186 [Sdoi2008]沙拉公主的困惑 欧拉函数
- 欧拉函数+逆元 [Sdoi2008]沙拉公主的困惑
- [BZOJ2186][SDOI2008]沙拉公主的困惑 欧拉函数
- [Sdoi2008]沙拉公主的困惑
- [SDOI2008]沙拉公主的困惑
- BZOJ 2186 [Sdoi2008]沙拉公主的困惑 线性逆元
- 【数学/扩展欧几里得/线性求逆元】[Sdoi2008]沙拉公主的困惑
- 【bzoj2186】[Sdoi2008]沙拉公主的困惑 数论 线性筛逆元
- BZOJ 2186 沙拉公主的困惑 逆元+素数筛+欧拉函数
- bzoj2186[沙拉公主的困惑] 欧拉函数 线性筛 乘法逆元
- Bzoj2186:[Sdoi2008]沙拉公主的困惑:欧拉函数+乘法逆元
- BZOJ 2186 [Sdoi2008] 沙拉公主的困惑 逆元/欧拉定理
- 神坑之java、安卓从Uri获取文件路径错误
- codeforces round 377 div2 F Tourist Reform tarjan求边双连通分量
- Hadoop作业提交多种方案具体流程详解
- 清华EMBA课程系列思考之十七(1) -- 新企业的孵化与创业投资
- JDK并发容器初步认识
- [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉
- PopupWindow+ListView并实现点击事件
- Linux内核移植 part3:串口驱动
- MyBatis的集合查询
- 冒泡排序
- c#数据结构之最大子数组问题(分治法)
- eclipse设置背景色为豆沙绿
- 学习Redis从这里开始
- Eclipse 设置编码格式