[题解]luogu_P2155_BZOJ_2186沙拉公主的困惑
题意求1~N!中与M!互质的数的个数,
首先证明gcd(a,b)=1时gcd(a-kb,b)=1
gcd(a,b)=1
gcd(a%b,b)=1
gcd(a-kb,b)=1
即a-kb与b互质
这样由于n!一定是m!的倍数,所以如果把n!分成很多段m!的和:1~m!,m!~2m!......
对于每一段的每个答案gcd(x,m!)=1时,也有gcd(x+km!,m!)=1
所以每段的答案都是一样的
这样答案变成了n!/m! * phi(m!)
对于phi(m!)用计算公式展开:

这里可以递推出相关的东西和逆元之类的,然而其实还可以继续简化运算

其实也只是不用求逆元了而已吧
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const int maxn=;
int n,m;
ll mod;
ll fac[maxn],f1[maxn],f2[maxn];
int prime[maxn];
bool ck[maxn];
void init(){
int tot=;
memset(ck,,sizeof(ck));
ck[]=ck[]=;
for(int i=;i<=maxn;i++){
if(!ck[i])prime[++tot]=i;
for(int j=;j<=tot;j++){
if(i*prime[j]>maxn)break;
ck[i*prime[j]]=;
if(i%prime[j]==)break;
}
}
}
ll qpow(ll a,ll b){
ll base=a,ans=;
while(b){
if(b&)ans=(ans*base)%mod;
base=(base*base)%mod;
b>>=;
}
return ans%mod;
}
int main(){
int T;
scanf("%d%lld",&T,&mod);
init();
fac[]=f1[]=f2[]=1ll;
for(int i=;i<maxn;i++){
fac[i]=fac[i-]*i%mod;
if(!ck[i])
f1[i]=f1[i-]*(i-)%mod,f2[i]=f2[i-]*i%mod;
else
f1[i]=f1[i-],f2[i]=f2[i-];
}
while(T--){
scanf("%d%d",&n,&m);
printf("%lld\n",((fac[n]*f1[m])%mod)*qpow(f2[m],mod-)%mod);
}
}
[题解]luogu_P2155_BZOJ_2186沙拉公主的困惑的更多相关文章
- Bzoj 2186: [Sdoi2008]沙拉公主的困惑 乘法逆元,线性筛,欧拉函数,数论
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2560 Solved: 857[Submit][St ...
- 【BZOJ2186】沙拉公主的困惑(数论)
[BZOJ2186]沙拉公主的困惑(数论) 题面 BZOJ 题解 考虑答案是啥 先假设\(n=m\) 现在求的就是\(\varphi(m!)\) 但是现在\(n!\)是\(m!\)的若干倍 我们知道 ...
- 【bzoj2186】[Sdoi2008]沙拉公主的困惑
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 3303 Solved: 1129[Submit][S ...
- 【BZOJ2186】[Sdoi2008]沙拉公主的困惑 线性筛素数
[BZOJ2186][Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M! ...
- BZOJ-2186 沙拉公主的困惑 线性筛(筛筛筛)+线性推逆元
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 2417 Solved: 803 [Submit][St ...
- 数学(逆元):BZOJ 2186: [Sdoi2008]沙拉公主的困惑
2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...
- 洛咕 P2155 [SDOI2008]沙拉公主的困惑
洛咕 P2155 [SDOI2008]沙拉公主的困惑 有个结论,就是如果\(gcd(a,b)=1\),那么\(gcd(a+kb,b)=1\).证明比较显然. 所以这个题目要问的\(n!\)就可以分成\ ...
- 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] ...
随机推荐
- winform中通过事件实现窗体传值思路【待修改】
Form2向Form1传值 private Form1 form1;//定义一个类型为Form1类型的字段,用于存储传递过来的Form对象 public void Se ...
- Hadoop- Hadoop环境搭建
Windows下Hadoop的安装 准备工具:64位的JDK,Hadoop安装包(我使用的是2.6.1) JDK下载地址 官网: http://www.oracle.com/technetwork/j ...
- matlab给图片插入说明文字
text(cluster().center(),cluster().center(),num2str(),'color','k') 格式是text(x,y,'说明文字') x,y代表位置
- matlab之find()函数
Find 这个函数用处也挺大的,这几天看很多程序都见到这一函数,今天要好好给阐述,了解下这个函数是为了找到矩阵或者是数组,向量中的非零元素.下面一大段英文没耐心看.看看例子就行了. 第一个用法是 nd ...
- Win7、Win8、Win10始终以管理员身份运行程序。
在Win7.Win8.Win10系统中,以管理员身份运行程序很麻烦,一般有以下几种方式: 1.在可执行程序或快捷方式上右键,以管理员身份运行: 2.在可执行程序或快捷方式上右键->属性-> ...
- 分享知识-快乐自己:IDEA 导入(web)项目并部署到 Tomcat
IDEA 导入 (WEB)项目并部署到 Tomcat 1):导入 Web 项目 2):首先更改 JDK 环境 右键项目: 第一步:点击 Modules 第二步:点击 Libraries 第三步:点 ...
- linux安装与卸载软件
在ubuntu系统中,通常使用apt-get命令完成对软件的安装与卸载 安装的软件通常都放置在一些源中,国内有很多镜像源供下载使用,而系统设置的源保存在目录/etc/apt/sources.list文 ...
- Linux 文本的^M问题
很多人在windows中使用文本编辑器编辑好文本后,传送到linux系统后,使用vi工具打开后发现每一行文本最后都有一个^M号,原因是: 在DOS使用的换行符为 \r\n,我们称为CR(\r)与LF( ...
- 高性能MySQL之【第十六章MySQL用户工具】学习记录
接口工具: Msql Workbench http://www.mysql.com/products/workbench SQLyog http://www.webyog.c ...
- bzoj 2626: JZPFAR k-D树
题目大意: 平面上n个点,每次给出一个点,求这个点的k远点 题解: 什么叫做k远点呢... 1 2 3 4 5中5是第一远,4是第二远... 看来我语文学的不好 那么我们直接上k-D Tree求k邻近 ...