bzoj 3285 离散对数解指数方程
/**************************************************************
Problem: 3285
User: idy002
Language: C++
Result: Accepted
Time:756 ms
Memory:32072 kb
****************************************************************/ #include <cstdio>
#include <cmath>
#include <cstring>
#include <cctype>
#define N 1000010 typedef long long dnt; const int Hmod = ;
struct Hash {
int head[N], key[N], val[N], next[N], etot;
void init() {
etot = ;
memset( head, , sizeof(head) );
}
void insert( int k, int v ) {
int kk = k%Hmod;
etot++;
key[etot] = k;
val[etot] = v;
next[etot] = head[kk];
head[kk] = etot;
}
int query( int k ) {
int kk = k%Hmod;
for( int t=head[kk]; t; t=next[t] )
if( key[t]==k ) return val[t];
return -;
}
}hash; dnt mpow( dnt a, int b, int c ) {
dnt rt;
for( rt=; b; b>>=,a=(a*a)%c )
if( b& ) rt=(rt*a)%c;
return rt;
}
int findroot( int p ) {
int phi = p-;
int tmp = phi;
int stk[], top;
top = ;
for( int i=; i<=(<<); i++ ) {
if( tmp%i== ) {
stk[++top] = i;
do {
tmp/=i;
}while( tmp%i== );
}
}
if( tmp!= )
stk[++top] = tmp;
for( int r=; ; r++ ) {
bool ok = true;
for( int i=; i<=top; i++ ) {
if( mpow(r,phi/stk[i],p)== ) {
ok=false;
break;
}
}
if( ok ) return r;
}
}
dnt ind( dnt r, int a, int p ) { // ind_r(a) mod p-1
int m = ceil(sqrt(p-));
hash.init();
dnt cur = ;
for( int i=; i<m; i++ ) {
if( cur==a ) return i;
hash.insert( cur, i );
cur = (cur*r) % p;
}
dnt base;
base = cur = mpow(cur,p-,p);
for( int i=m; i<p; i+=m,cur=(cur*base)%p ) {
int j = hash.query( a*cur%p );
if( j!=- ) return i+j;
}
return -; // impossible
}
dnt gcd( dnt a, dnt b ) {
return b ? gcd(b,a%b) : a;
}
void exgcd( dnt a, dnt b, dnt &d, dnt &x, dnt &y ) {
if( b== ) {
d=a, x=, y=;
} else {
exgcd(b,a%b,d,y,x);
y-=a/b*x;
}
}
dnt meq( dnt a, dnt b, dnt c ) { // ax=b mod c
dnt d, dd, x, y;
a = (a%c+c)%c;
b = (b%c+c)%c;
d = gcd(a,c);
if( b%d!= ) return -;
exgcd(a/d,c/d,dd,x,y);
x = x*(b/d);
x = (x%(c/d)+(c/d))%(c/d);
if( x== ) x+=c/d;
return x;
} dnt a, b, c, g, p, r;
int aa[N], bb[N], cc[N], gg[N]; void read( int a[] ) {
int i;
char ch;
for( i=; isdigit(ch=getchar()); i++ )
a[i] = ch-'';
a[i] = -;
}
dnt modulo( int a[], dnt mod ) {
dnt rt = ;
for( int i=; a[i]!=-; i++ )
rt = (rt* + a[i]) % mod;
return rt;
}
int main() {
read(aa);
read(bb);
read(cc);
read(gg);
scanf( "%lld", &p );
a = modulo(aa,p-);
b = modulo(bb,p-),
c = modulo(cc,p);
g = modulo(gg,p); if( g%p== || c%p== ) {
if( g%p== && c%p== )
printf( "1\n" );
else
printf( "no solution\n" );
return ;
}
r = findroot(p);
// fprintf( stderr, "%d\n", (int)r );
dnt ans = meq( a*ind(r,g,p), ind(r,c,p)-b*ind(r,g,p), p- );
if( ans< )
printf( "no solution\n" );
else
printf( "%lld\n", ans );
}
bzoj 3285 离散对数解指数方程的更多相关文章
- bzoj 3751: [NOIP2014]解方程 同余系枚举
3.解方程(equation.cpp/c/pas)[问题描述]已知多项式方程:a ! + a ! x + a ! x ! + ⋯ + a ! x ! = 0求这个方程在[1, m]内的整数解(n 和 ...
- 牛顿迭代法解指数方程(aX + e^x解 = b )
高中好友突然问我一道这样的问题,似乎是因为他们专业要做一个计算器,其中的一道习题是要求计算器实现这样的功能. 整理一下要求:解aX + e^X = b 方程.解方程精度要求0.01,给定方程只有一解, ...
- bzoj 3751: [NOIP2014]解方程
Description 已知多项式方程: a0+a1x+a2x^2+...+an*x^n=0 求这个方程在[1,m]内的整数解(n和m均为正整数). 解题报告: 这题比较诡,看到高精度做不了,就要想到 ...
- BZOJ 3751: [NOIP2014]解方程 数学
3751: [NOIP2014]解方程 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3751 Description 已知多项式方程: ...
- bzoj 3751: [NOIP2014]解方程【数学】
--我真是太非了,自己搞了7个质数都WA,从别人那粘5个质数就A了-- 就是直接枚举解,用裴蜀定理计算是否符合要求,因为这里显然结果很大,所以我们对多个质数取模看最后是不是都为0 #include&l ...
- -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
[把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...
- bzoj 2654 && bzoj 3675 总结
手动博客搬家: 本文发表于20180929 15:18:55, 原地址https://blog.csdn.net/suncongbo/article/details/82897992 最近做到了两道( ...
- bzoj1644 / P1649 [USACO07OCT]障碍路线Obstacle Course
P1649 [USACO07OCT]障碍路线Obstacle Course bfs 直接上个bfs 注意luogu的题目和bzoj有不同(bzoj保证有解,还有输入格式不同). #include< ...
- BZOJ4869:[SHOI2017]相逢是问候——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=4869 题面复制于洛谷:https://www.luogu.org/problemnew/show/P ...
随机推荐
- [整理]javascript压缩、格式化
1.使用packer来压缩JS文件 packer工具在线版:http://dean.edwards.name/packer/ 通过packer对js打包压缩的同时,执行Base62 encode编码后 ...
- 【51Nod】1055 最长等差数列 动态规划
[题目]1055 最长等差数列 [题意]给定大小为n的互不不同正整数集合,求最长等差数列的长度.\(n \leq 10000\). [算法]动态规划 两个数之间的差是非常重要的信息,设\(f_{i,j ...
- mac 无法验证副本
转: 这个是拆机后断了电源,导致时间不对,也就是说现在电脑的时间比U盘制作的时间还早,所以有这样的错误提示. 在终端里面修改时间请参考下面的代码,按回车键确认:date 062614102014.30 ...
- es6笔记(6) Iterator 和 for...of循环
概要 js中的数组.对象,加上ES6中增加的Map.Set四种数据集合. Iterator提供了一种机制,为各种不同的数据结构提供统一的访问机制.任何数据结构只要部署Iterator接口,就可以完成遍 ...
- java学习第03天(运算符、语句)
5.运算符 (1)算数运算符 //算数运算符:+ - * / %(取余) //++ --(自增,就是在原有数据基础上+1,再赋给原有数据) ///int x = 6370; //x = x/1000* ...
- 如何教会老婆写 Python ?
什么是code? code就就是一种语言,一种计算机能读懂的语言.计算机是一个傻逼,他理解不了默认两可的任何东西. 比如,你让你老公去买个西瓜,你老公会自己决定去哪里买,买几个,找个搞活动打折的买,总 ...
- CSS font系列
font-family font-family: Verdana,Helvetica,Arial,"Microsoft YaHei",sans-serif; font-family ...
- centos6.8安装mysql5.6【转】
首先先要去看看本机有没有默认的mysql, 本地默认有的,我们应先卸载,在安装新的这个逻辑. rpm -qa | grep mysql 我本机默认安装的mysql5.1.73 下一步删除 rpm -e ...
- 激活Window和office工具
激活Window和office工具: 第一种工具(已使用工具激活microsoft office professional plus 2013版本): 暴风激活工具(暴风激活工具 ...
- django Rest Framework---缓存通过drf-extensions扩展来实现
什么情况下使用缓存 1.不经常更新的数据 2.用户经常访问的一些页面,比如商品列表页.商品详情页等 3.用户经常修改的一些操作:购物车.订单中心等 关于DRF缓存扩展可以参考文档:http://chi ...