题意求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沙拉公主的困惑的更多相关文章

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

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

  2. 【BZOJ2186】沙拉公主的困惑(数论)

    [BZOJ2186]沙拉公主的困惑(数论) 题面 BZOJ 题解 考虑答案是啥 先假设\(n=m\) 现在求的就是\(\varphi(m!)\) 但是现在\(n!\)是\(m!\)的若干倍 我们知道 ...

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

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

  4. 【BZOJ2186】[Sdoi2008]沙拉公主的困惑 线性筛素数

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

  5. BZOJ-2186 沙拉公主的困惑 线性筛(筛筛筛)+线性推逆元

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

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

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

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

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

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

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

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

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

随机推荐

  1. java语言中Object对象的hashCode()取值的底层算法是怎样实现的

    Java语言中,Object对象有个特殊的方法:hashcode(), hashcode()表示的是JVM虚拟机为这个Object对象分配的一个int类型的数值,JVM会使用对象的hashcode值来 ...

  2. 算法(Algorithms)第4版 练习 1.3.11

    主要思路: 这个和Dijkstrad的双栈算法不太一样,后缀的计算只需要一个栈即可. 用一个栈来存数字栈即可. 遇到数字,压栈. 遇到运算法,从栈中弹出相应的数字,用该运算法计算得到结果. 再次压入栈 ...

  3. animate旋转动画练习,css3形变练习

    <!DOCTYPE html> <!-- saved from url=(0048)http://yinjiazeng.github.io/test/dial/index.html ...

  4. oracle中导出sql的几个常见词语的意思

    set feedback off不显示反馈信息  “1行已插入”,大量数据装入时,显示这个也是很浪费资源和时间的. set define off 如果你某个字段里面有&字符,插入数据会出错,设 ...

  5. 1>/dev/null 2>&1 & 意思解析

    原文:https://jingyan.baidu.com/article/6dad5075334e26a123e36e31.html 用 /dev/null 2>&1 这样的写法.这条命 ...

  6. 在线接口管理工具-eoapi

    为了方便和前端沟通,临时在局域网搭建了一个接口管理工具,查了一些资料都说eoapi不错,那就试了一下: 1.安装 要在服务器或者自己的电脑,准备web环境,Linux可以是Apache/nginx , ...

  7. ACM学习历程——UVA127 "Accordian" Patience(栈, 链表)

    Description  ``Accordian'' Patience  You are to simulate the playing of games of ``Accordian'' patie ...

  8. Father Christmas flymouse

    Father Christmas flymouse Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 3479   Accep ...

  9. Redis 客户端安装与远程连接图解

    Linux环境:Centos 6.8 Redis服务端版本:3.2.6 Redis客户端下载链接:https://redisdesktop.com/download 省略Linux系统安装Redis教 ...

  10. 一个节点rac+单节点dg网络配置(listener.ora与tnsnames.ora)

    环境说明:  实验环境是 一个节点的 rac + 单机dg    (主备全部用asm存储) tnsnames.ora  文件  (oracle用户) node 1 : node1-> pwd / ...