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]沙拉公主的困惑 解题报告的更多相关文章

  1. [bzoj2186] [洛谷P2155] [Sdoi2008] 沙拉公主的困惑

    Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现 ...

  2. 洛咕 P2155 [SDOI2008]沙拉公主的困惑

    洛咕 P2155 [SDOI2008]沙拉公主的困惑 有个结论,就是如果\(gcd(a,b)=1\),那么\(gcd(a+kb,b)=1\).证明比较显然. 所以这个题目要问的\(n!\)就可以分成\ ...

  3. P2155 [SDOI2008]沙拉公主的困惑

    \(\color{#0066ff}{ 题目描述 }\) 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大 ...

  4. Bzoj 2186: [Sdoi2008]沙拉公主的困惑 乘法逆元,线性筛,欧拉函数,数论

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2560  Solved: 857[Submit][St ...

  5. 数学(逆元):BZOJ 2186: [Sdoi2008]沙拉公主的困惑

    2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...

  6. BZOJ2186: [Sdoi2008]沙拉公主的困惑(求[1,N!]与M!互素的个数)(线性筛)

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 6103  Solved: 2060[Submit][S ...

  7. BZOJ2186 [Sdoi2008]沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 5003  Solved: 1725 [Submit] ...

  8. 【BZOJ 2186】 2186: [Sdoi2008]沙拉公主的困惑 (欧拉筛,线性求逆元)

    2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...

  9. 【bzoj2186】[Sdoi2008]沙拉公主的困惑

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3303  Solved: 1129[Submit][S ...

随机推荐

  1. Linux平台下卸载MySQL的方法

    转载自: https://www.cnblogs.com/taomylife/p/7234925.html Linux平台下卸载MySQL的方法: MySQL的安装主要有三种方式:二进制包安装.RPM ...

  2. struts2之标签库

    使用Struts2标签的准备工作: 导入Struts2标签库,该标签定义文件位于 struts2-core-2.3.16.3.jar 的 METE-INF下的struts-tag.tld文件. < ...

  3. 【vlan-端口配置】

    搭建好拓扑图如下: 分别配置两台终端的ip地址 创建vlan把e0/4/0接口加入到新的vlan中 连通性失败 . 同理在把e0/4/1加入到vlan视图中 连通性成功 : 搭建好拓扑图如下 进入e0 ...

  4. 关于移动端video标签层级问题

    这是在微信中正常页面,就是用了一个原生video标签没做任何处理.然后顶部是固定页面顶端的,这个时候向上滑动页面时,会出现下图现象 这个时候正常人都会想到z-index问题,我也是这样想的,可惜很抱歉 ...

  5. redis源代码结构解析

    看了黄建宏老师的<Redis设计与实现>,对redis的部分实现有了一个简明的认识: 之前面试的时候被问到了这部分的内容,没有关注,好在还有时间,就把Redis的源码看了一遍. Redis ...

  6. php 变量的8类类型

    整形,布尔,浮点形,字符串,数组,资源,对象和null php数据类型之查看和判断数据类型 php数据类型之自动转换和强制转换

  7. PHP 防止 E-mail 注入( PHP 过滤器)

    PHP 防止 E-mail 注入 防止 e-mail 注入的最好方法是对输入进行验证. 下面的代码与上一节类似,不过我们已经增加了检测表单中 email 字段的输入验证程序: <html> ...

  8. PAT (Basic Level) Practice 1004 成绩排名

    个人练习 读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为\ 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行 ...

  9. 笔记-python-standard library-17.7 queue

    笔记-python-standard library-17.7 queue 1.  queue source code:Lib/queue.py 该模块实现了多生产者,多消费者队列. 此模块实现了所有 ...

  10. 笔记-python-redis接口

    笔记-python-redis接口 1.      python 与redis接口 redis是redis数据库的python接口包,为python提供的redis的调用接口. 注:文档内容主要基于h ...