中国剩余定理+原根+扩展欧几里得+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. LoadRunner FAQ2

    LR中参数的定义和赋值 1.参数的赋值和取值 lr_save_string("hello world","param"); lr_eval_string(&qu ...

  2. awk 基本函数用法

    gsub函数有点类似于sed查找和替换.它允许替换一个字符串或字符为另一个字符串或字符,并以正则表达式的形式执行.第一个函数作用于记录$0,第二个gsub函数允许指定目标,然而,如果未指定目标,缺省为 ...

  3. 在chrome开发者工具中观察函数调用栈、作用域链、闭包

    在chrome的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察JavaScript的执行过程,直观感知函数调用栈,作用域链,变量对象,闭包,this等关键信息的变化.因此,断点调试对于快 ...

  4. [ 转载 ] Centos 安装mysql后启动失败 出现 ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’

    MySQL Daemon failed to start Mysql出问题一定要学会查看log https://blog.csdn.net/shuai825644975/article/details ...

  5. luoguP4783 [模板]矩阵求逆 线性代数

    求\(n^2\)的矩阵的逆 翻了翻题解,看到了初等矩阵这个东西,突然想起来在看线代的时候看到过.... 然后又温习了一遍线性代数的知识 不妨设\(PA = E\),其中\(P\)是一堆初等矩阵的积(必 ...

  6. LOJ.114.K大异或和(线性基)

    题目链接 如何求线性基中第K小的异或和?好像不太好做. 如果我们在线性基内部Xor一下,使得从高到低位枚举时,选base[i]一定比不选base[i]大(存在base[i]). 这可以重构一下线性基, ...

  7. Sql server 存储过程基础语法

    一.定义变量 --简单赋值 declare @a int print @a --使用select语句赋值 declare @user1 nvarchar() select @user1='张三' pr ...

  8. CentOS6.X关闭防火墙

    一.关闭防火墙 1.重启后永久性生效: 开启:chkconfig iptables on 关闭:chkconfig iptables off 2.即时生效,重启后失效: 开启:service ipta ...

  9. 匹配<a href="url">content</a>

    grep -Po '<a href="(.*.rmvb")>(.*)</a>' te.txt | sed -n 's/<a href=\(.*\)&g ...

  10. 使用NFS启动Tiny4412开发板根文件系统

      1.Ubuntu14.04上搭建NFS服务 1.1.安装NFS服务 $ sudo apt-get install nfs-kernel-server    //安装NFS服务 1.2 创建Tiny ...