洛谷 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 ...
随机推荐
- 用Java读取xml文件内容
在AXP中,DOM解析器是1 Document Builder类的一个实例,该实例由 DocumenBailderfactorv类负责创,步如下 DocumentBuilderFactory fa ...
- 懒下载软件,一行代码连接wifi^_^
按键盘的windows+R,输入cmd,回车键 设置语句netsh wlan set hostednetwork mode=allow ssid=user key=possword 按回车键 启动语句 ...
- Maven - 配置镜像仓库
默认仓库的配置(全球中央仓库): 可以打开maven的安装目录/conf/settings.xml文件,配置镜像,找到如下一段配置,这里默认没有配置任何镜像,但是有一个被注释的配置范例: id: 镜像 ...
- kubernetes基础架构及原理
kubernetes简称“k8s” 其中“8”代表的是“k”和“s”中间的8个字母. k8s是Google公司开发的Borg项目中独立出来的容器编排工具,然后将其捐献给CNCF这个组织,然后发扬光大. ...
- Yii2 设计模式
一. 单例模式 顾名思义, 单例模式就是只实例一次,通过一个接口去实现多处需要的同一类对象的需求. 例子: public function __construct($config = []) { Yi ...
- python+scrapy环境搭建步骤描述
Python3(3.5.4)搭建爬虫系统步骤描述: 1.下载python安装包,路径:https://www.python.org/downloads/windows/ 选择3.5.4版本64位的安 ...
- iOS-重构微博cell模型
一.Frame模型: -------------------WeiboFrame.h-------------------------------------------------- ------- ...
- Numpy数据存取与函数
数据的CSV文件存取 多维数据的存取 NumPy的随机数函数 NumPy的统计函数 NumPy的梯度函数
- python基础之正则表达式爬虫应用,configparser模块和subprocess模块
正则表达式爬虫应用(校花网) 1 import requests 2 import re 3 import json 4 #定义函数返回网页的字符串信息 5 def getPage_str(url): ...
- 15.9,python操作redis集群
上代码 .对redis的单实例进行连接操作 python3 >>>import redis >>>r = redis.StrictRedis(host=, db ...