中国剩余定理+原根+扩展欧几里得+BSGS


  题解:http://blog.csdn.net/regina8023/article/details/44863519

  新技能get√:

 LL Get_yuangen(LL p,LL phi){
int c=;
for(int i=;i*i<=phi;i++)
if (phi%i==)
f[++c]=i,f[++c]=phi/i;
for(int g=;;g++){
int j;
for(j=;j<=c;j++) if (Pow(g,f[j],p)==) break;
if (j==c+) return g;
}
return ;
}

求原根

 void Split(int x){
num=;
for(int i=;i*i<=x;i++)
if (x%i==){
a[++num].p=i;
a[num].c=; a[num].pc=;
while(x%i==)
x/=i,a[num].c++,a[num].pc*=i;
if (x==) break;
}
if (x!=)
a[++num].p=x,a[num].pc=x,a[num].c=;
}

分解一个数为$p_i^{a_i}$

 /**************************************************************
Problem: 2219
User: Tunix
Language: C++
Result: Accepted
Time:288 ms
Memory:5076 kb
****************************************************************/ //BZOJ 2219
#include<cmath>
#include<map>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=1e5+;
const LL inf=1e18;
/*******************template********************/ map<LL,LL> mp;
struct data{
LL p,c,pc;
}a[N];
int num,cnt;
LL f[N];
void Split(int x){
num=;
for(int i=;i*i<=x;i++)
if (x%i==){
a[++num].p=i;
a[num].c=; a[num].pc=;
while(x%i==)
x/=i,a[num].c++,a[num].pc*=i;
if (x==) break;
}
if (x!=)
a[++num].p=x,a[num].pc=x,a[num].c=;
}
LL Pow(LL a,LL b,LL p){
LL r=;
for(;b;b>>=,a=a*a%p) if (b&) r=r*a%p;
return r;
} LL Get_yuangen(LL p,LL phi){
int c=;
for(int i=;i*i<=phi;i++)
if (phi%i==)
f[++c]=i,f[++c]=phi/i;
for(int g=;;g++){
int j;
for(j=;j<=c;j++) if (Pow(g,f[j],p)==) break;
if (j==c+) return g;
}
return ;
} void exgcd(LL a,LL b,LL &d,LL &x,LL &y){
if (!b) {d=a;x=;y=;return;}
else{exgcd(b,a%b,d,y,x); y-=x*(a/b);}
} LL BSGS(LL A,LL B,LL C){
int m=ceil(sqrt(C+0.5));
mp.clear();
LL now=;
F(i,,m){
now = now*A%C;
if (!mp[now]) mp[now]=i;
}
mp[]=;
A=Pow(A,m,C);
now=1LL;
F(i,,m){
LL d,x,y;
exgcd(now,C,d,x,y);
x=(x*B%C+C)%C;
if (mp.count(x)) return i*m+mp[x];
now=now*A%C;
}
return ;
} LL gcd(LL a,LL b){return b ? gcd(b,a%b) : a;} LL solve(LL A,LL B,LL k){
LL phi=a[k].pc-a[k].pc/a[k].p,
g=Get_yuangen(a[k].pc,phi);
LL ind=BSGS(g,B,a[k].pc);
LL ans=gcd(phi,A);
if (ind%ans) return ;
return ans*Pow(a[k].p,cnt-cnt/A,inf);
} int main(){
#ifndef ONLINE_JUDGE
freopen("2219.in","r",stdin);
freopen("2219.out","w",stdout);
#endif
int T=getint();
while(T--){
LL A=getint(),B=getint(),k=getint();
LL p=*k+;
Split(p);
LL ans=;
F(i,,num){
if (!ans) break;
if (B%a[i].pc==)
ans=ans*Pow(a[i].p,a[i].c-(a[i].c-)/A-,inf);
else{
int b=B;
cnt=;
while((b%a[i].p)==){
b/=a[i].p;
a[i].pc/=a[i].p;
a[i].c--,cnt++;
}
if (cnt % A) ans=;
else ans=ans*solve(A,b,i);
}
}
printf("%lld\n",ans);
}
return ;
}

2219: 数论之神

Time Limit: 3 Sec  Memory Limit: 259 MB
Submit: 410  Solved: 48
[Submit][Status][Discuss]

Description


ACM_DIY群中,有一位叫做“傻崽”的同学由于在数论方面造诣很高,被称为数轮之神!对于任何数论问题,他都能瞬间秒杀!一天他在群里面问了一个神
题: 对于给定的3个非负整数 A,B,K 求出满足 (1) X^A = B(mod 2*K + 1) (2) X 在范围[0, 2K]
内的X的个数!自然数论之神是可以瞬间秒杀此题的,那么你呢?

Input

第一行有一个正整数T,表示接下来的数据的组数( T <= 1000) 之后对于每组数据,给出了3个整数A,B,K (1 <= A, B <= 10^9, 1 <= K <= 5 * 10^8)

Output

输出一行,表示答案

Sample Input

3
213 46290770 80175784
3 46290770 80175784
3333 46290770 80175784

Sample Output

27
27
297

HINT

新加数组一组--2015.02.27

Source

[Submit][Status][Discuss]

【BZOJ】【2219】数论之神的更多相关文章

  1. BZOJ 2219 数论之神 (CRT推论+BSGS+原根指标)

    看了Po神的题解一下子就懂了A了! 不过Po神的代码出锅了-solve中"d-temp"并没有什么用QwQQwQQwQ-应该把模数除以p^temp次方才行. 来自BZOJ讨论板的h ...

  2. BZOJ 2219: 数论之神

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2219 N次剩余+CRT... 就是各种奇怪的分类讨论.. #include<cstrin ...

  3. bzoj2219: 数论之神

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

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

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

  5. BZOJ2219 数论之神 数论 中国剩余定理 原根 BSGS

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2219.html 题目传送门 - BZOJ2219 题意 求同余方程 $x^A\equiv B \pmo ...

  6. 牛客国庆集训派对Day5 数论之神

    题目描述 终于活成了自己讨厌的样子. 这是她们都还没长大的时候发生的故事.那个时候,栗子米也不需要为了所谓的爱情苦恼. 她们可以在夏日的午后,花大把的时间去研究生活中一些琐碎而有趣的事情,比如数论. ...

  7. BZOJ 4815 数论

    今年的重庆省选? 具体就是,对于每次修改,A[p,q]这个位置,  设d=gcd(p,q) ,则 gcd为d的每一个格子都会被修改,且他们之间有个不变的联系 A[p,q]/p/q==A[k,t]/k/ ...

  8. BZOJ 1037 生日聚会(神DP)

    这题的DP很难想,定义dp[i][j][a][b]表示用了i个男生,j个女生,任一连续的后缀区间内,男生比女生最多多a人,女生比男生最多多b人. 转移就是显然了. # include <cstd ...

  9. bzoj 1406 数论

    首先问题的意思就是在找出n以内的所有x^2%n=1的数,那么我们可以得到(x+1)(x-1)=y*n,那么我们知道n|(x+1)(x-1),我们设n=a*b,那么我们对于任意的a,我们满足n%a==0 ...

随机推荐

  1. Django第一步

    对于一个web框架,掌握了三部分的内容,就可以说是迈出了第一步. 1. 准备开发环境 2. 创建一个工程,并运行 3. 开发hello world应用 1. 准备环境 首先应该是安装python和dj ...

  2. Chrome谷歌浏览器拓展组件的2种快速安装方法(.crx)

    谷歌浏览器拓展有至少2种安装方法,现在简单的介绍下. 第一种.当然是进入谷歌官方的应用商店直接安装 这种方法简单快捷,而且官方支持度够高,唯一的缺点是大陆用户需要“FQ”. 谷歌拓展组件应用商店地址: ...

  3. 【基础知识】ASP.NET[基础一(ashx)]

    一.ASP.NET介绍 1.ASP.NET包括: 一般处理程序(ashx):WebForm ( aspx ):MVC(Model view con~~): 2.ASP.NET的常用文件(重点): 1& ...

  4. 每日踩坑 2018-06-19 AutoMapper简单性能测试

    想使用 AutoMapper 类库来做一些映射到 DTO 对象的操作 但既然类似这样的类库内部是用反射来实现的,那么会比较在意性能. 所以来简单测试一下性能. 关于测试结果呢 emmmm 我是比较吃惊 ...

  5. 当你的静态资源CDN挂掉了该怎么办?

    都知道使用静态的CDN引入jQuery等一些js包的时候,会提升网页的性能,那么,如果你引入CDN的地址挂掉了,那么项目同样也会挂掉,所以我们需要在引入的时候添加一个判断.如下: <script ...

  6. Java设计模式GOF之工厂模式

    一.工厂模式(Factory) 1.实现了创建者和调用者的分离 2.应用场景 ①JDK中 Calendar 的 getInstance(): ②JDBC 的 Connection 对象的获取: ③Hi ...

  7. 高并发系列之——负载均衡,web负载均衡

    1 前言 负载均衡,一般包含两方面的含义.一方面是,将单一的重负载分担到多个网络节点上做并行处理,每个节点处理结束后将结果汇总返回给用户,这样可以大幅提高网络系统的处理能力: 第二个方面的含义是,将大 ...

  8. 解决Jboss中log4j在应用里面无法使用的问题

    [参考1]解决Jboss中log4j在应用里面无法使用的问题http://developer.51cto.com/art/200906/128691.htm文章中说到“如果你的应用下存在WEB-INF ...

  9. bzoj 4127 线段树维护绝对值之和

    因为d>=0,所以一个位置的数只会单调不降并且只会有一次穿过0. 用这个性质,我们我可在线段树中记录正数负数的个数和和,以及最大的负数以及答案. 修改操作:如果当前最大负数+d<=0,那么 ...

  10. Python文件类型

    Python的文件类型分为三种:源代码.字节代码.优化代码. 1. 源代码    Python源代码文件,即py脚本文件,由 python.exe 解释,可在控制台下运行.pyw脚本文件是图形用户接口 ...