题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2219

N次剩余+CRT。。。

就是各种奇怪的分类讨论。。

#include<cstring>
#include<iostream>
#include<cstdio>
#include<map>
#include<cmath>
#include<algorithm>
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define down(i,l,r) for (int i=l;i>=r;i--)
#define clr(x,y) memset(x,y,sizeof(x))
#define maxn 50050
#define inf 2000000000
using namespace std;
int a,b,k,p,t,ans;
map<int,int> mp;
int read(){
int x=,f=; char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-; ch=getchar();}
while (isdigit(ch)) {x=x*+ch-''; ch=getchar();}
return x*f;
}
int Pow(int x,int y){
int ans=;
while (y){
if (y&) ans=1LL*ans*x;
x=1LL*x*x; y>>=;
}
return ans;
}
int Pow(int x,int y,int mo){
int ans=; while (y){
if (y&) ans=1LL*ans*x%mo;
x=1LL*x*x%mo; y>>=;
}
return ans;
}
int divs[maxn],dtot;
int groot(int p){//是对于p-1的每一个素因子a去检查(p-1)/a!!
dtot=;
int q=p-;
for (int i=;i*i<=q;i++){
if (q%i==) {
divs[++dtot]=i;
if (i*i!=q) divs[++dtot]=q/i;
}
}
for (int i=;i<p;i++){
int ok=;
rep(j,,dtot) if (Pow(i,divs[j],p)==) {ok=;break;}
if (!ok) return i;
}
}
int exgcd(int a,int b,int &x,int &y){
if (b==) {
x=; y=; return a;
}
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int gcd(int a,int b){
if (b==) return a;
return gcd(b,a%b);
}
int NI(int a,int b){
int x,y;
exgcd(a,b,x,y);
return (x%b+b)%b;
}
int bsgs(int a,int b,int p){
mp.clear();
int m=sqrt(p)+,mul,tmp;
int now=; rep(i,,m-) {if (!mp.count(now)) mp[now]=i; now=1LL*now*a%p;}
now=; mul=Pow(a,m,p);
rep(i,,m-){
tmp=1LL*b*NI(now,p)%p;
if (mp.count(tmp)) return mp[tmp]+i*m;
now=1LL*now*mul%p;
if (now==) break;
}
return inf;
}
int solve(int a,int b,int p,int d){
int pd=Pow(p,d);
b=b%pd;
if (b==) return Pow(p,d-((d-)/a+));
else {
int bet=;
while (b%p==) bet++,b/=p;
if (bet%a!=) return ;
int tt=bet/a;
int g=groot(p),phi=pd-pd/p;
int ind=bsgs(g,b,pd);
int d=gcd(a,phi);
if (ind%d==) return d*Pow(p,(a-)*tt);
else return ;
}
}
int main(){
t=read();
while (t--){
a=read(); b=read(); k=read();
p=*k+;
ans=;
for (int i=;i*i<=p&&ans;i++) if ((p%i)==) {
int now=; while ((p%i)==) p/=i,now++;
ans=ans*solve(a,b,i,now);
}
if (p!=&&ans) ans=ans*solve(a,b,p,);
printf("%d\n",ans);
}
return ;
}

最新文章

  1. mainBundle和CustomBundle
  2. POJ2472106 miles to Chicago
  3. ARM Linux启动代码分析
  4. Redis/SSDB+Twemproxy的配置与使用(Mac/Linux平台)
  5. 313. Super Ugly Number
  6. Java最重要的21个技术点和知识点之JAVA多线程、时间处理、数据格式
  7. sleep与wait的区别,详细解答(通过代码验证)
  8. 【基础】常用的机器学习&amp;数据挖掘知识点
  9. Javascript事件模型(一):DOM0事件和DOM2事件
  10. obj-c编程10:Foundation库中类的使用(1)[数字,字符串]
  11. redis相关操作
  12. .Net NPOI 上传excel文件、提交后台获取excel里的数据
  13. LeetCode算法题-Sum of Two Integers(Java实现)
  14. Mac 解压zip文件错误:无法将&quot;*.zip&quot;解压缩到&quot;&quot; (错误 1-操作不被允许)
  15. Django REST framework 之分页,视图,路由,渲染器
  16. RabbitMQ基础知识详解
  17. C# WINFORM 打包数据库
  18. python 的几种启动方式
  19. centos killall安装
  20. mysql too many max_connections

热门文章

  1. ES6之Promise
  2. C++ 知识点总结复习
  3. adb指令介绍
  4. javascript + sql编写SQL客户端工具tabris
  5. (一)基于阿里云的MQTT远程控制(Android 连接MQTT服务器,ESP8266连接MQTT服务器实现远程通信控制----简单的连接通信)
  6. Nodejs使用redis
  7. Python个人项目--豆瓣图书个性化推荐
  8. Java语言的概述?-什么是Java? (附一张Java工程师的学习路线图)
  9. SqlServer Partition 分区表
  10. 每天学一点Docker(1)