「SDOI2008沙拉公主的困惑」
看着有点可怕
求
\]
考虑一下\(m=n\)的时候的答案
非常显然就是\(\varphi(m!)\)
而如果\(n>m\)
非常显然\(m!|n!\)
可以把\(n!\)想象成一个大数轴,将这个大数轴分成\(\frac{n!}{m!}\)部分,每一部分都有\(m!\)个数
第一部分的贡献是\(\varphi(m!)\)非常显然
第二部分的每个数\(k\)和\(m!\)求\(gcd\)
我们更相减损
\]
\(k-m!\)对应了第一部分里的数,所以第二个块的贡献也是\(\varphi(m!)\)
剩下的每一个块都可以通过更相减损转化成上一个块,所以每一个快的答案都是\(\varphi(m!)\)
一共\(\frac{n!}{m!}\)个块,所以答案就是
\]
通过分解质因数的方法去求\(\varphi(m!)\)非常不科学
我们考虑线性推出所有的\(\varphi(i!)\)
如果\(i\)为质数,那么\(i\)这个质因子在之前没有出现过,那么贡献是\(i-1\)
否则这些质因子在之前都出现过,所以贡献是\(i\)
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 10000005
#define LL long long
#define inf 999999999
inline int max(int a,int b) {return a>b?a:b;}
inline int read()
{
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
LL mod,phi[maxn];
int T,D,U;
struct Ask{int N,M,rk;}a[10005];
LL ans[100005];
inline int cmp(Ask A,Ask B) {return A.M<B.M;}
void exgcd(LL a,LL b,LL &x,LL &y) {if(!b) {x=1,y=0;return;}exgcd(b,a%b,y,x);y-=a/b*x;}
inline LL inv(LL a) {LL x,y;exgcd(a,mod,x,y);return (x%mod+mod)%mod;}
int f[maxn],p[maxn>>1];
int b[maxn];
LL fac[maxn];
int main()
{
T=read();mod=read();
for(re int i=1;i<=T;i++) a[i].N=read(),a[i].M=read(),a[i].rk=i,D=max(D,a[i].N),U=max(U,a[i].M);
fac[0]=1;f[1]=1,phi[1]=1;
for(re int i=2;i<=U;i++)
{
if(!f[i]) p[++p[0]]=i,phi[i]=(phi[i-1]*(LL)(i-1))%mod;
else phi[i]=(phi[i-1]*(LL)i)%mod;
for(re int j=1;j<=p[0]&&p[j]*i<=U;j++)
{
f[p[j]*i]=1;
if(i%p[j]==0) break;
}
}
for(re int i=1;i<=D;i++) fac[i]=fac[i-1]*i%mod;
for(re int i=1;i<=T;i++) printf("%lld\n",fac[a[i].N]*inv(fac[a[i].M])%mod*phi[a[i].M]%mod);
return 0;
}
「SDOI2008沙拉公主的困惑」的更多相关文章
- 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!互质的钞 ...
- 洛咕 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] ...
- 【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 ...
- 【BZOJ2186】[Sdoi2008]沙拉公主的困惑 线性筛素数
[BZOJ2186][Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M! ...
- 【bzoj2186】: [Sdoi2008]沙拉公主的困惑 数论-欧拉函数
[bzoj2186]: [Sdoi2008]沙拉公主的困惑 考虑当 gcd(a,b)=1 则 gcd(nb+a,b)=1 所以[1,N!]与M!互质的个数就是 筛出[1,M]所有的素数p[i] 以及逆 ...
随机推荐
- VUE--mixins的一些理解。
概念:混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. 用法: 1.创建混 ...
- Eclipse/Myeclipse/Scala IDEA for Eclipse里两种添加插件的方法(在线和离线)
不多说,直接上干货! 方法1:在线安装 第一步,在eclipse菜单栏下,选中help ---->Install New Software 第二步,点击图中 add 添加软件下载地址 第三步 , ...
- 东拼西凑 vim配置-更新
"============================================================= "========================== ...
- Nginx使用的php-fpm的两种进程管理方式及优化
PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式.与Apache类似,它的进程数也是可以根据设置分为动态和静态的. php-fpm目前主要又两个分支,分别对应于php-5. ...
- Coursera 机器学习 第8章(下) Dimensionality Reduction 学习笔记
8 Dimensionality Reduction8.3 Motivation8.3.1 Motivation I: Data Compression第二种无监督问题:维数约简(Dimensiona ...
- QQ音乐:React v16 新特性实践
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由QQ音乐技术团队发表于云+社区专栏 自从去年9月份 React 团队发布了 v16.0 版本开始,到18年3月刚发布的 v16.3 版 ...
- jQuery 文本插入和标签移动方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Javascript 对象Object
1.new构造函数法 2.对象字面量 对象字面量很好理解,使用key/value的形式直接创建对象,简洁方便. 这种方式直接通过花括号将对象的属性包起来,使用key/value的方式创建对象属性, ...
- 如何取得GridView被隐藏列的值
如何取得GridView被隐藏列的值 分类: ASP.net 2009-06-25 12:47 943人阅读 评论(1 ...
- ThreadPoolExecutor(上篇)
Java有两个线程池类:ThreadPoolExecutor和ScheduledThreadPoolExecutor,继承AbstractExecutorService类,AbstractExecut ...