洛谷 P2155 [SDOI2008]沙拉公主的困惑 解题报告
P2155 [SDOI2008]沙拉公主的困惑
题目描述
大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为\(1\)到\(N\)的阶乘,但是,政府只发行编号与\(M!\)互质的钞票。房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量。现在,请你帮助沙拉公主解决这个问题,由于可能张数非常大,你只需计算出对\(R\)取模后的答案即可。\(R\)是一个质数。
输入输出格式
输入格式:
第一行为两个整数\(T\),\(R\)。\(R \le 10^9+10\),\(T \le 10000\),表示该组中测试数据数目,\(R\)为模。
后面\(T\)行,每行一对整数\(N\),\(M\),见题目描述\(m \le n\)
输出格式:
共\(T\)行,对于每一对\(N\),\(M\),输出\(1\)至\(N!\)中与\(M!\)素质的数的数量对\(R\)取模后的值
题意:
求\(\frac{N!}{M!} \varphi(M!)\)
注意,这里每\(M!\)段互质的个数是一样的,可以用\(gcd(a,b)=gcd(b,a-b)\)证明,而\(M!|N!\),才有了上面一个式子
按照欧拉函数定义式化简一下
\(N!\prod_{p|m!}\frac{p-1}{p}\),\(p\)质数
很明显把两个乘积项预处理一下,右边可以二分找一下
注意预处理阶乘时不能简单的预处理,因为如果\(R \le N\),那么就输出\(0\)了,事实上不一定输出\(0\)
先把\(R\)的次数拿出来,然后再搞一搞
是不是感觉这样是\(O(NlogR)\)的?事实上不是
这个和\(N!\)中\(R\)的次数直接相关,设\(f(n)\)代表\(n!\)中有多少个因子\(r\)
显然有\(f(n)=f(\lfloor \frac{n}{r} \rfloor)+\lfloor \frac{n}{r} \rfloor\)
结果是\(O(n)\)的
事实上跑上去有点慢。。
Code:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
const int N=1e7;
const int M=7e5;
bool ispri[N+10];
int pri[M],cnt,fr[M],num[M],fac[N+10],numfac[N+10],r,t,n,m;
int mul(int a,int b)
{
ll c=(ll)(a)*b%r;
return (int)(c);
}
int inv(int b,int k)
{
int f=1;
while(k)
{
if(k&1) f=mul(f,b);
b=mul(b,b);
k>>=1;
}
return f;
}
void init()
{
memset(ispri,true,sizeof(ispri));
for(int i=2;i<=N;i++)
{
if(ispri[i])
pri[++cnt]=i;
for(int j=1;j<=cnt&&pri[j]*i<=N;j++)
{
ispri[pri[j]*i]=false;
if(i%pri[j]==0) break;
}
}
fr[0]=1;
for(int i=1;i<=cnt;i++)
{
num[i]=num[i-1];
fr[i]=fr[i-1];
if(pri[i]-1==r)
++num[i],fr[i]=mul(fr[i],inv(pri[i],r-2));
else if(pri[i]==r)
--num[i],fr[i]=mul(fr[i],pri[i]-1);
else
fr[i]=mul(fr[i],mul(inv(pri[i],r-2),pri[i]-1));
}
fac[0]=1;
for(int i=1;i<=N;i++)
{
fac[i]=fac[i-1];
numfac[i]=numfac[i-1];
int d=i;
while(d%r==0) ++numfac[i],d/=r;
fac[i]=mul(fac[i],d);
}
}
int main()
{
scanf("%d%d",&t,&r);
init();
while(t--)
{
scanf("%d%d",&n,&m);
int pos=std::upper_bound(pri+1,pri+1+cnt,m)-pri-1;
int ans=mul(fac[n],fr[pos]);
if(num[pos]+numfac[n]==0) printf("%d\n",ans);
else printf("0\n");
}
return 0;
}
2018.9.27
洛谷 P2155 [SDOI2008]沙拉公主的困惑 解题报告的更多相关文章
- [bzoj2186] [洛谷P2155] [Sdoi2008] 沙拉公主的困惑
Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现 ...
- 洛咕 P2155 [SDOI2008]沙拉公主的困惑
洛咕 P2155 [SDOI2008]沙拉公主的困惑 有个结论,就是如果\(gcd(a,b)=1\),那么\(gcd(a+kb,b)=1\).证明比较显然. 所以这个题目要问的\(n!\)就可以分成\ ...
- P2155 [SDOI2008]沙拉公主的困惑
\(\color{#0066ff}{ 题目描述 }\) 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大 ...
- Bzoj 2186: [Sdoi2008]沙拉公主的困惑 乘法逆元,线性筛,欧拉函数,数论
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2560 Solved: 857[Submit][St ...
- 数学(逆元):BZOJ 2186: [Sdoi2008]沙拉公主的困惑
2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...
- BZOJ2186: [Sdoi2008]沙拉公主的困惑(求[1,N!]与M!互素的个数)(线性筛)
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 6103 Solved: 2060[Submit][S ...
- BZOJ2186 [Sdoi2008]沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 5003 Solved: 1725 [Submit] ...
- 【BZOJ 2186】 2186: [Sdoi2008]沙拉公主的困惑 (欧拉筛,线性求逆元)
2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...
- 【bzoj2186】[Sdoi2008]沙拉公主的困惑
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 3303 Solved: 1129[Submit][S ...
随机推荐
- Python——列表
应用场景,要统计大量的人员信息.就可以用列表的形式进行.name = ['邱秀','玄永俊','杨栋豪']查:print(name[2],name[0]) #取号码进行识别print(name[1:3 ...
- JAVA / MySql 编程——第五章 事务、视图、索引、备份和恢复
1.事务(Transaction): 事务是将一系列数据操作绑成一个整体进行统一管理. 如果一事务执行成功,则咋子该事务中进行的所有数据更改均会提交,称为数据库中的永久成部分. 如果事务执行是遇到错误 ...
- 记一次微信小程序在安卓的白屏问题
在做小程序的时候,做到了一个限时商品售卖,用到了倒计时,因为这个原因导致了安卓手机上使用小程序时,将小程序放入后台运行一段时间后,再次进入小程序后出现了页面白屏或者点击事件失效的情况,这里记录下 1. ...
- c# 解决读取Excel混合文本类型,数据读取失败的解决方法
错误重现: ----------------------------------------------------------------------- 在导入Excel读取数据时,其中的一个字段保 ...
- 【c学习-4】
//递归函数,调用自身 #include<stdio.h> int fibFunc(int n) { || n==){ ; }else{ )+fibFunc(n-); } } int ma ...
- IOS中input与fixed同时存在的情况会出现bug
两种解决方案,一种是将内容区域放在中间部分,只是中间部分在滚动(还是固定在底部):另一种是判断当是ios时,将其转换为absolute定位.(跟随着页面的滚动而滚动);; 当使用input时,fixe ...
- python__系统 : socket_TCP补充,协程
TCP 三次握手: SYN --> SYN+ACK --> ACK 四次挥手: FIN --> ACK (FIN) --> ACK TCP十种状态: LISTEN ...
- 呕心沥血写的python猜数字
#猜数字 import random num_rd=random.randint(0,100) count=1 while 1<=count<=10: num_ip=input('请输入0 ...
- linux-shell——04
mv 移动文件或者目录 格式:mv [选项] 源文件/目录 目标文件/目录 注:若移动目标位置与源位置相同(当前下操作),则此操作相当于重命名(改名) ex: [root@local ...
- Codeforces Round #482 (Div. 2) :C - Kuro and Walking Route
题目连接:http://codeforces.com/contest/979/problem/C 解题心得: 题意就是给你n个点,在点集中间有n-1条边(无重边),在行走的时候不能从x点走到y点,问你 ...