问题:可能逆元不存在吗?

题解:

Gcd(a,b)==Gcd(b,a-b);

从数据范围可以看出应该求M!的欧拉函数;

然后通过Gcd转化过去

一开始没想到

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long Lint;
const int maxT=20000;
const int maxn=10000009;
int T,r;
int mn=0,mm=0; int inn[maxT];
int inm[maxT];
Lint fac[maxn]; int vis[maxn]= {0};
int prime[maxn],cntprime=0;
int Lineshake() {
vis[1]=1;
for(int i=2; i<=mm; ++i) {
if(!vis[i]) {
prime[++cntprime]=i;
}
for(int j=1; (j<=cntprime)&&(i*prime[j]<=mm); ++j) {
vis[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
} Lint ksm(Lint a,Lint p) {
Lint ret=1;
for(; p; p>>=1,a=a*a%r) {
if(p&1)ret=ret*a%r;
}
return ret;
}
Lint inv(Lint x) {
return ksm(x,r-2);
} Lint phi[maxn]; int main() {
scanf("%d%d",&T,&r);
for(int i=1; i<=T; ++i) {
scanf("%d%d",&inn[i],&inm[i]);
mn=max(mn,inn[i]);
mm=max(mm,inm[i]);
} fac[1]=1;
for(int i=2; i<=mn; ++i)fac[i]=fac[i-1]*i%r;
Lineshake(); phi[1]=1;
for(int i=2; i<=mm; ++i) {
if(!vis[i]) {
phi[i]=phi[i-1]*(i-1)%r*inv(i)%r;
} else {
phi[i]=phi[i-1];
}
} for(int i=1; i<=T; ++i) {
printf("%lld\n",fac[inn[i]]*phi[inm[i]]%r);
}
return 0;
}

  

最新文章

  1. LDAP与SSH
  2. 坑!坑!坑!防不胜防的unsigned int的运算
  3. DEDECMS之十 修改织梦链和文章的默认来源及作者
  4. RabbitMQ 安装
  5. U3D包大小优化之microlib
  6. 编译android程序时DEX过程出现错误
  7. Xcode5新特性
  8. BZOJ 1455: 罗马游戏( 配对堆 + 并查集 )
  9. java学习笔记13--比较器(Comparable、Comparator)
  10. Git详解之九:Git内部原理
  11. centos7.5环境下编译安装php7.0.30并安装redis和mongo扩展
  12. unity 安装破解提示partern not found和tutorials学习
  13. vscode sass live compiler
  14. Linux 小知识翻译 - 「Linux和CPU的兼容性」
  15. win7下面搭建angularjs开发环境
  16. EXCEL 偶数、奇数行分开求和公式
  17. Spark学习之概念了解
  18. python3版本中的zip函数
  19. MSMQ消息传递的优先级
  20. javascript之继承

热门文章

  1. SQL SERVER查询数据库所有的表名/字段
  2. LNMP 常见问题(FAQ)
  3. Task使用注意
  4. 阿里云服务器 :Linux环境下搭建Apache+php+mysql
  5. CentOS7 环境下 在Hadoop集群安装Hive
  6. sqli-labs level 2
  7. Adapter之spinner
  8. POJ 3349:Snowflake Snow Snowflakes 六片雪花找相同的 哈希
  9. [Codeforces]1263B PIN Code
  10. synchronized wait notify 生产者消费者