【BZOJ】【2219】数论之神
中国剩余定理+原根+扩展欧几里得+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
213 46290770 80175784
3 46290770 80175784
3333 46290770 80175784
Sample Output
27
297
HINT
新加数组一组--2015.02.27
Source
【BZOJ】【2219】数论之神的更多相关文章
- BZOJ 2219 数论之神 (CRT推论+BSGS+原根指标)
		
看了Po神的题解一下子就懂了A了! 不过Po神的代码出锅了-solve中"d-temp"并没有什么用QwQQwQQwQ-应该把模数除以p^temp次方才行. 来自BZOJ讨论板的h ...
 - BZOJ 2219: 数论之神
		
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2219 N次剩余+CRT... 就是各种奇怪的分类讨论.. #include<cstrin ...
 - bzoj2219: 数论之神
		
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
 - BZOJ2219数论之神——BSGS+中国剩余定理+原根与指标+欧拉定理+exgcd
		
题目描述 在ACM_DIY群中,有一位叫做“傻崽”的同学由于在数论方面造诣很高,被称为数轮之神!对于任何数论问题,他都能瞬间秒杀!一天他在群里面问了一个神题: 对于给定的3个非负整数 A,B,K 求出 ...
 - BZOJ2219 数论之神 数论 中国剩余定理 原根 BSGS
		
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2219.html 题目传送门 - BZOJ2219 题意 求同余方程 $x^A\equiv B \pmo ...
 - 牛客国庆集训派对Day5     数论之神
		
题目描述 终于活成了自己讨厌的样子. 这是她们都还没长大的时候发生的故事.那个时候,栗子米也不需要为了所谓的爱情苦恼. 她们可以在夏日的午后,花大把的时间去研究生活中一些琐碎而有趣的事情,比如数论. ...
 - BZOJ 4815 数论
		
今年的重庆省选? 具体就是,对于每次修改,A[p,q]这个位置, 设d=gcd(p,q) ,则 gcd为d的每一个格子都会被修改,且他们之间有个不变的联系 A[p,q]/p/q==A[k,t]/k/ ...
 - BZOJ 1037 生日聚会(神DP)
		
这题的DP很难想,定义dp[i][j][a][b]表示用了i个男生,j个女生,任一连续的后缀区间内,男生比女生最多多a人,女生比男生最多多b人. 转移就是显然了. # include <cstd ...
 - 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 ...
 
随机推荐
- Java 集合Collection——初学者参考,高手慎入(未完待续)
			
1.集合简介和例子 Collection,集合.和数学定义中的集合类似,把很多元素放在一个容器中,方便我们存放结果/查找等操作. Collection集合实际上是很多形式集合的一个抽象. 例如十九大就 ...
 - CodeForces 140C New Year Snowmen(堆)
			
题面 CodeForces 题解 因为要保证两两不同,所以不能单纯的开堆来维护,堆维护一个二元组,个数为第一关键字,编号为第二关键字,对于一个相同的颜色,统计一下这个颜色的个数再用堆来维护就好了. # ...
 - Bzoj4710 分特产(容斥原理+组合数)
			
题面 Bzoj 题解 考虑容斥原理,所有人都有特产的方案数等于: 至少零个人没有特产\(-\)至少一个人没有特产\(+\)至少两个人有特产\(-...\) 接着考虑其中一种情况怎么求(假设现在至少有\ ...
 - 1002 A+B for Polynomials (25)(25 point(s))
			
problem 1002 A+B for Polynomials (25)(25 point(s)) This time, you are supposed to find A+B where A a ...
 - android  打开 res raw目录 中 数据库文件
			
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 安卓不能直接打开 res raw 中的 数据库 文件. 通过 资源 获取资源 方法 , ...
 - Bzoj1018[SHOI2008]堵塞的交通traffic(线段树)
			
这题需要维护连通性,看到有连接删除,很容易直接就想LCT了.然而这题点数20w操作10w,LCT卡常估计过不去.看到这个东西只有两行,考虑能否用魔改后的线性数据结构去维护.我想到了线段树. 考虑如果两 ...
 - HDU 2553 N皇后问题(深搜DFS)
			
N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
 - poj 1328 Radar Installation 排序贪心
			
Radar Installation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 56702 Accepted: 12 ...
 - 全栈project师体能备战--知识面(1--10)
			
javascript 单例设计模式: 单例模式确保某个类仅仅有一个势力,并且自行实例化并向整个系统提供这个实例.如:cocos2dx中的导演类.[样例]我有6哥美丽的老婆,他们的老公都 ...
 - Linux下分割、合并文件——dd和cat
			
功能说明:读取,转换并输出数据. 语 法:dd [bs=<字节数>][cbs=<字节数>][conv=<关键字>][count=<区块数>][ibs=& ...