sgu——261(数论之N次剩余问题)
来源:互联网 发布:2345王牌软件 编辑:程序博客网 时间:2024/05/21 21:39
题目地址:http://acm.sgu.ru/problem.php?contest=0&problem=261
小结:涉及到测试法求元根、线性方程求解、离散对数问题,是数论里代码多的问题,但是基本上就是个模板题。
#include<map>#include<cstdio>#include<cmath>#include<vector>#include<iostream>#include<algorithm>using namespace std;typedef long long ll;vector<ll>f,as;ll pow(ll a,ll b,ll mod){ //快速幂 ll as=1;while(b){if(b&1) as=(as*a)%mod;a=(a*a)%mod; b>>=1;}return as;}bool g_test(ll g,ll p){ //元根测试函数 for(ll i=0;i<f.size();i++) if(pow(g,(p-1)/f[i],p)==1) return 0;return 1;}ll yuangen(ll p){ //求元根 f.clear();ll tmp=p-1;for(ll i=2;i<=tmp/i;i++) if(tmp%i==0){ f.push_back(i);while(tmp%i==0) tmp/=i;}if(tmp!=1)f.push_back(tmp);ll g=0;while(++g) if(g_test(g,p)) return g;}ll discrete_log(ll x,ll n,ll m){//x^y=n (mod m) 求 y,离散对数问题 map<ll,int>rec;ll s=(ll)(sqrt(m*1.0)+0.5);ll cur=1;for(int i=0;i<s;i++){rec[cur]=i;cur=cur*x%m;}ll mul=cur;cur=1;for(int i=0;i<s;i++){ll more=n*pow(cur,m-2,m)%m;if(rec.count(more))return i*s+rec[more];cur=cur*mul%m;}return -1;}ll ex_gcd(ll a,ll b,ll& x,ll& y){ //扩展欧几里得 if(b==0){x=1;y=0;return a;}else{ll r=ex_gcd(b,a%b,y,x);y-=x*(a/b);return r;}}void line_mod_equation(ll a,ll b,ll n){//ax=b (mod n) 求x(线性方程求解) ll x,y,d;as.clear();d=ex_gcd(a,n,x,y);if(b%d==0){x%=n;x+=n;x%=n;as.push_back(x*(b/d)%(n/d));for(ll i=1;i<d;i++) as.push_back((as[0]+i*n/d)%n);}}int main(){ll a,k,p,g,q;while(scanf("%lld%lld%lld",&p,&k,&a) != -1 ){if(a==0){puts("1\n0");continue;}//a==0特判g=yuangen(p);q=discrete_log(g,a,p);line_mod_equation(k,q,p-1);//注意是p-1 for(int i=0;i<as.size();i++) as[i]=pow(g,as[i],p);sort(as.begin(),as.end());printf("%d\n",as.size());for(int i=0;i<as.size();i++) printf("%lld%c",as[i],i==as.size()-1?'\n':' ');}return 0;}
- sgu——261(数论之N次剩余问题)
- SGU 261 Discrete Roots N次剩余
- SGU 261. Discrete Roots (N次剩余)
- SGU 261 Discrete Roots (经典K次剩余)
- 51nod 1038(n次剩余)
- N次剩余 (hdu 3930)
- hdu 3930 N次剩余
- 数论——中国剩余定理
- 数论——中国剩余定理
- HDU 1573 X问题 数论-(中国剩余定理)
- N次剩余(详解+例题+代码)
- SGU - 154 - Factorial (数论)
- SGU 126 Boxes(数论)
- N对数的排列问题(数论)
- POJ 1006 中国剩余定理(孙子定理) ——数论
- 数论常用内容——中国剩余定理
- 数论复习之中国剩余定理
- C++第五次剩余项目—数组选择(非实验和作业)
- Java中getClassLoader().getResourceAsStream("XXX")的用法
- poj 1006 生理周期 中国剩余定理
- Qt MVC之自定义模型
- Linux下c开发 之 线程通信
- Android 利用反射实现不安装直接运行APK(动态加载)
- sgu——261(数论之N次剩余问题)
- 窗口重绘一点通
- 子窗口与父窗口的消息传递
- opencv识别正方形(矩形)代码(转)
- Reactor模式 - @ libevent by c【转载内容】
- VC 绘图,使用双缓冲技术实现
- CodeForces #196(Div. 2) 337D Book of Evil (树形dp)
- 二分匹配(入门)
- Cocos2d-x 解惑