【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 ...
随机推荐
- AlexNet的参数优化
优化算法的参数 论文中使用SGD算法,基本参数设置在前面优化算法的总结中已经提到了.这里要说几个个人体会. a. 原文中输入的batch数目是256,应该Alex经过调节后的结果,我实际用到的机器性能 ...
- 二、django rest_framework源码之认证流程剖析
1 绪言 上一篇中讲了django rest_framework总体流程,整个流程中最关键的一步就是执行dispatch方法.在dispatch方法中,在调用了一个initial方法,所有的认证.权限 ...
- iOS 9应用开发教程之多行读写文本ios9文本视图
iOS 9应用开发教程之多行读写文本ios9文本视图 多行读写文本——ios9文本视图 文本视图也是输入控件,与文本框不同的是,文本视图可以让用户输入多行,如图2.23所示.在此图中字符串“说点什么吧 ...
- python orm字段解析
null # 是否可以为空 default # 默认值 primary_key # 主键 db_column # 列名 db_index # 索引(db_index=True) unique # 唯一 ...
- virtualenv虚拟环境安装不同版本的django
在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4.所有第三方的包都会被pip安装到Python3的site-packages目录下. 如果我们要同时开发多个应用程序,那这 ...
- 「HNOI2018」转盘
「HNOI2018」转盘 现场推出了大部分结论但是只写了 \(40\) 分暴力,被贺指导踩爆,现在还有点怀念 HNOI2018 贺指导对着镜子荒野行动的日子,那几天他云球迷瞎**指点篮球,被送上指导称 ...
- luoguP5108 仰望半月的夜空 [官方?]题解 后缀数组 / 后缀树 / 后缀自动机 + 线段树 / st表 + 二分
仰望半月的夜空 题解 可以的话,支持一下原作吧... 这道题数据很弱..... 因此各种乱搞估计都是能过的.... 算法一 暴力长度然后判断判断,复杂度\(O(n^3)\) 期望得分15分 算法二 通 ...
- 【spfa】【动态规划】zoj3847 Collect Chars
转载自:http://blog.csdn.net/madaidao/article/details/42616743 Collect Chars Time Limit: 2 Seconds ...
- [COGS 2066]七十与十七
http://218.28.19.228/cogs/problem/problem.php?pid=2066 [题目描述] 七十君最近爱上了排序算法,于是Ta让十七君给Ta讲冒泡排序. 十七君给七十君 ...
- Codeforces Round #358 (Div. 2) C. Alyona and the Tree 水题
C. Alyona and the Tree 题目连接: http://www.codeforces.com/contest/682/problem/C Description Alyona deci ...