题目

看着有点可怕

\[\sum_{i=1}^{n!}[(i,m!)=1]
\]

考虑一下\(m=n\)的时候的答案

非常显然就是\(\varphi(m!)\)

而如果\(n>m\)

非常显然\(m!|n!\)

可以把\(n!\)想象成一个大数轴,将这个大数轴分成\(\frac{n!}{m!}\)部分,每一部分都有\(m!\)个数

第一部分的贡献是\(\varphi(m!)\)非常显然

第二部分的每个数\(k\)和\(m!\)求\(gcd\)

我们更相减损

\[(k,m!)=(m!,k-m!)
\]

\(k-m!\)对应了第一部分里的数,所以第二个块的贡献也是\(\varphi(m!)\)

剩下的每一个块都可以通过更相减损转化成上一个块,所以每一个快的答案都是\(\varphi(m!)\)

一共\(\frac{n!}{m!}\)个块,所以答案就是

\[\frac{n!}{m!}\varphi(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;
}

最新文章

  1. Freemarker判断是否为空
  2. redis数据类型之—List
  3. 关于div的滚动条滚动到底部,内容显示不全的问题。(已解决)
  4. 博客的开端,找对象不再new
  5. Android样式的开发:Style篇
  6. http cookies
  7. cshell学习
  8. Swing中弹出对话框的几种方式(转)
  9. JavaScript设计模式_03_代理模式
  10. 关于磁盘冗余阵列、热备、群集、负载均衡、云计算、F5、Nginx等的概念和基本原理
  11. Apache虚拟主机实战
  12. darknet的安装及报错解决
  13. Python+Selenium笔记(九):操作警告和弹出框
  14. Java对中文进行排序
  15. 论文笔记之:Human-level control through deep reinforcement learning
  16. [转]C#综合揭秘——Entity Framework 并发处理详解
  17. HDU 6006 状压dp
  18. 如何禁止Linux内核的-O2编译选项【转】
  19. trello 项目管理开启卡片图片显示
  20. .net core系列之《在.net core中使用MemoryCache实现本地缓存》

热门文章

  1. 常用维护SQL-数据清理
  2. Spring JDBC Framework
  3. Centos 添加swap
  4. SQLAlchemy安装和使用
  5. BFC --- Block Formatting Context --- 块级格式化上下文
  6. JUnit异常断言
  7. IE6,IE7,IE8 css bug搜集及浏览器兼容性问题解决方法汇总
  8. Vue1.0基础学习笔记整理
  9. java输出九九乘法口诀表
  10. MyBatis 中 sqlmapconfig核心标签typeAliases配置说明