原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2219.html

题目传送门 - BZOJ2219

题意

  求同余方程 $x^A\equiv B \pmod{C}$ 的解的个数,其中 $C$ 为一个奇数。

  $1\leq A,B\leq 10^9,1\leq \lfloor C/2 \rfloor \leq 5\times 10^8$

题解

UPD(2018-09-10):

  详见数论总结。

  传送门 - https://www.cnblogs.com/zhouzhendong/p/Number-theory-Residue-System.html

代码

#include <bits/stdc++.h>
using namespace std;
const int N=100005;
int read(){
int x=0;
char ch=getchar();
while (!isdigit(ch))
ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
int pcnt,f[N],Prime[N];
void Get_Prime(int n){
memset(f,0,sizeof f);
pcnt=0;
for (int i=2;i<=n;i++){
if (f[i])
continue;
Prime[++pcnt]=i;
for (int j=i+i;j<=n;j+=i)
f[j]=1;
}
}
void Divide(int x,int *p,int *q,int &cnt){
cnt=0;
for (int i=1;i<=pcnt&&Prime[i]*Prime[i]<=x;i++){
if (x%Prime[i])
continue;
p[++cnt]=Prime[i],q[cnt]=0;
while (x%p[cnt]==0)
x/=p[cnt],q[cnt]++;
}
if (x>1)
p[++cnt]=x,q[cnt]=1;
}
int Pow(int x,int y,int mod){
int ans=1;
for (;y;y>>=1,x=1LL*x*x%mod)
if (y&1)
ans=1LL*ans*x%mod;
return ans;
}
int Pow(int x,int y){
return Pow(x,y,2e9);
}
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int Fac[50],Fac_cnt=0;
bool Get_g_Check(int P,int C,int x){
int phi=Pow(P,C-1)*(P-1),pw=Pow(P,C);
if (C>1&&Pow(x,phi/P,pw)==1)
return 0;
for (int i=1;i<=Fac_cnt;i++)
if (Pow(x,phi/Fac[i],pw)==1)
return 0;
return 1;
}
int Get_g(int P,int C){
int v=P-1;
Fac_cnt=0;
for (int i=1;i<=pcnt&&Prime[i]*Prime[i]<=v;i++)
if (v%Prime[i]==0){
Fac[++Fac_cnt]=Prime[i];
while (v%Prime[i]==0)
v/=Prime[i];
}
if (v>1)
Fac[++Fac_cnt]=v;
for (int i=2;;i++)
if (Get_g_Check(P,C,i))
return i;
return -1;
}
struct hash_map{
static const int Ti=233,mod=1<<16;
int cnt,k[mod+1],v[mod+1],nxt[mod+1],fst[mod+1];
int Hash(int x){
int v=x&(mod-1);
return v==0?mod:v;
}
void clear(){
cnt=0;
memset(fst,0,sizeof fst);
}
void update(int x,int a){
int y=Hash(x);
for (int p=fst[y];p;p=nxt[p])
if (k[p]==x){
v[p]=a;
return;
}
k[++cnt]=x,nxt[cnt]=fst[y],fst[y]=cnt,v[cnt]=a;
return;
}
int find(int x){
int y=Hash(x);
for (int p=fst[y];p;p=nxt[p])
if (k[p]==x)
return v[p];
return 0;
}
int &operator [] (int x){
int y=Hash(x);
for (int p=fst[y];p;p=nxt[p])
if (k[p]==x)
return v[p];
k[++cnt]=x,nxt[cnt]=fst[y],fst[y]=cnt;
return v[cnt]=0;
}
}Map;
int BSGS(int A,int B,int P){
int M=max((int)(0.8*sqrt(1.0*P)),1),AM=Pow(A,M,P);
Map.clear();
for (int b=0,pw=B;b<M;b++,pw=1LL*pw*A%P)
Map.update(pw,b+1);
for (int a=M,pw=AM;a-M<P;a+=M,pw=1LL*pw*AM%P){
int v=Map.find(pw);
if (v)
return a-(v-1);
}
return -1;
}
int RHD(int A,int B,int P,int C){
int g=Get_g(P,C);
int t=BSGS(g,B,Pow(P,C));
int mod=(P-1)*Pow(P,C-1);
int GCD=gcd(mod,gcd(A,t));
return gcd(A,mod)>GCD?0:GCD;
}
int solve(int A,int B,int P,int C){
int pw=Pow(P,C),Phi=(P-1)*Pow(P,C-1);
B%=pw;
if (B==0)
return Pow(P,C-((C+A-1)/A));
int g=gcd(B,pw),Q=0;
B/=g;
while (g>1)
g/=P,Q++;
return Pow(P,Q-Q/A)*((Q%A)?0:RHD(A,B,P,C-Q));
}
int main(){
Get_Prime(1e5);
int T=read();
while (T--){
int A=read(),B=read(),P=2*read()+1;
int cnt,p[50],q[50];
Divide(P,p,q,cnt);
int ans=1;
for (int i=1;i<=cnt;i++)
ans*=solve(A,B,p[i],q[i]);
printf("%d\n",ans);
}
return 0;
}

  

BZOJ2219 数论之神 数论 中国剩余定理 原根 BSGS的更多相关文章

  1. 51Nod1123 X^A Mod B 数论 中国剩余定理 原根 BSGS

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1123.html 题目传送门 - 51Nod1123 题意 $T$ 组数据. 给定 $A,B,C$,求 ...

  2. BZOJ2219数论之神——BSGS+中国剩余定理+原根与指标+欧拉定理+exgcd

    题目描述 在ACM_DIY群中,有一位叫做“傻崽”的同学由于在数论方面造诣很高,被称为数轮之神!对于任何数论问题,他都能瞬间秒杀!一天他在群里面问了一个神题: 对于给定的3个非负整数 A,B,K 求出 ...

  3. 【BZOJ】【2219】数论之神

    中国剩余定理+原根+扩展欧几里得+BSGS 题解:http://blog.csdn.net/regina8023/article/details/44863519 新技能get√: LL Get_yu ...

  4. bzoj2219: 数论之神

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  5. 【中国剩余定理】【容斥原理】【快速乘法】【数论】HDU 5768 Lucky7

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5768 题目大意: T组数据,求L~R中满足:1.是7的倍数,2.对n个素数有 %pi!=ai  的数 ...

  6. 数论F - Strange Way to Express Integers(不互素的的中国剩余定理)

    F - Strange Way to Express Integers Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format: ...

  7. 中国剩余定理(CRT)与欧拉函数[数论]

    中国剩余定理 ——!x^n+y^n=z^n 想必大家都听过同余方程这种玩意,但是可能对于中国剩余定理有诸多不解,作为一个MOer&OIer,在此具体说明. 对于同余方程: x≡c1(mod m ...

  8. BZOJ1951 [Sdoi2010]古代猪文 中国剩余定理 快速幂 数论

    原文链接http://www.cnblogs.com/zhouzhendong/p/8109156.html 题目传送门 - BZOJ1951 题意概括 求 GM mod 999911659 M=∑i ...

  9. POJ 2891 Strange Way to Express Integers 中国剩余定理 数论 exgcd

    http://poj.org/problem?id=2891 题意就是孙子算经里那个定理的基础描述不过换了数字和约束条件的个数…… https://blog.csdn.net/HownoneHe/ar ...

随机推荐

  1. ZOJ 2110 DFS

    狗要出门,且正好在T秒 就是DFS + 剪枝, 联系一下剪枝技巧 #include<iostream> #include<cstdio> #include<cstring ...

  2. [MySQL]InnoDB引擎的行锁和表锁

    1.行锁和表锁 在mysql 的 InnoDB引擎支持行锁,与Oracle不同,mysql的行锁是通过索引加载的,即是行锁是加在索引响应的行上的,要是对应的SQL语句没有走索引,则会全表扫描, 行锁则 ...

  3. socket原理-基于UDP的套接字-基于TCP实现远程命令-粘包

  4. iOS10 远程通知需要有entitlements的支持

    今天测试远程通知,发现ios9上可以收到,但是ios10上无法收到,原来是忘记开下面这个选项了: 这样看来iOS9 对这个entitlement没有什么依赖,但是10却是必须打开的!

  5. MicroPython的开发板

    比如: pyboard micro:bit ESP8266/ESP32 stm32等等 什么是pyboard? pyboard是官方的MicroPython微控制器板,完全支持软件功能.硬件有: ST ...

  6. Confluence 6 通过 SSL 或 HTTPS 运行 - 修改你 Confluence 的 server.xml 文件

    下一步你需要配置 Confluence 来使用 HTTPS: 编辑 <install-directory>/conf/server.xml 文件. 取消注释下面的行: <Connec ...

  7. Confluence 6 启用主题评论

    页面或者博客页面中显示的评论以下面 2 种方式显示: 主题模式(Threaded):以继承回复的方式显示页面的评论.每一回复的评论将会在不同评论之间显示,以表示各个评论之间的关系. 平面模式(Flat ...

  8. SWift中 '?' must be followed by a call, member lookup, or subscript 错误解决方案

    那是因为你在使用自己写的分类时没有指定返回的数据类型  指定下返回数据类型就好了 我是用的oc写的分类在Swift中使用的 错误代码 private lazy var btn = UIButton.C ...

  9. matlab提取wind底层数据库操作

    首先需要安装navicat for SQL server 软件, 为了实现Matlab 通过JDBC方式连接Sqlserver数据库, 需要安装Sqlserver JDBC驱动. 地址: https: ...

  10. Python面向对象 三大特性 综合案例+1(视频里的作业)

    class Dog: # 在创建一个小狗实例的时候,给它设置几个属性 def __init__(self, name, age = 1): self.name = name self.age = ag ...