POJ1808 平方(二次)同余方程
POJ1808 给定一个方程 x*x==a(mod p) 其中p为质数 判断是否有解
程序中 MOD_sqr()返回整数解 无解返回-1
数学证明略
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
using namespace std;
typedef long long int LL; vector<LL>anss;
LL ans[1000000];
LL pow(LL n,LL k,LL p);
inline LL findv(LL x,LL p);
LL GCD(LL a,LL b)//Euclid
{
return b==0?a:GCD(b,a%b);
}
void extend_GCD(LL a,LL b,LL &x,LL &y)//extend Euclid
{
if(b==0){x=1;y=0;}
else {extend_GCD(b,a%b,y,x);y-=a/b*x;}
}
LL line_mod_equation(LL a,LL b,LL n)//二元一次线性不定方程求解
{
LL x,y;
extend_GCD(a,n,x,y);
LL d=GCD(a,n);
if(b%d==0)
{
while(x<0)x+=n;
while(x>n)x-=n;
LL a1=x*(b/d)%(n/d);
while(a1-n/d>0)a1-=n/d;
return a1;//此处只返回最小正整数解 若要解序列 在主函数中生成
}
return -1;
}
LL CRT(int a[],int m[],int n)//中国剩余定理
{
int M=1;
for(LL i=0;i<n;i++)
M*=m[i];
LL ret=0;
for(LL i=0;i<n;i++)
{
LL x,y;
LL tm=M/m[i];
extend_GCD(tm,m[i],x,y);
ret=(ret+tm*x*a[i])%M;
}
while(ret<0)ret+=M;
while(ret>M)ret-=M;
return ret;
}
inline LL findRoot(LL p)
{
LL s=ceil(sqrt(p-1));
for(LL i=1;i<p;i++)
{
if(pow(i,p-1,p)==1)
{
bool sign=1;
for(LL j=2;j<=s;j++)
if(((p-1)%j==0)&&(pow(i,(p-1)/j,p)==1))
{sign=0;break;}
if(sign)return i; }
}
return -1;
}
LL pow(LL n,LL k,LL p)
{
if(k==0)return 1;
LL w=1;
if(k&1)w=n%p;
LL ans=pow(n*n%p,k>>1,p);
return ans*w%p;
}
inline LL ind(LL x,LL p,LL g)//g^y=x(mod p) return y
{
static map<LL,LL>tmp;
LL s=ceil(sqrt(p));
LL w=pow(g,s,p);
for(LL r=0;r<=s;++r)tmp.insert(make_pair(pow(g, r, p), r));
for(LL t=0;t<=s;++t)
{
LL gt=pow(w,t,p);
LL anti=findv(gt,p);
if(tmp.count(x*anti%p))return (tmp[x*anti%p]+t*s); }
return -1;
}
inline LL findv(LL x,LL p)
{
LL d,t;
extend_GCD(x,p,d,t);
while(d<0)d+=p;
return d;
}
LL MOD_sqr(LL a,LL p)//求解 x^2=a(modp)原理有待证明
{
if(p==2)return a%p;
if(pow(a,(p-1)/2,p)!=1)return -1;
LL x;
if(p%4==3)x=pow(a,(p+1)/4,p);
else
{
LL b;
for(b=1;pow(b,(p-1)/2,p)==1;b++);
LL i=(p-1)/2,k=0;
do
{
i>>=1;k>>=1;
if((pow(a,i,p)*pow(b,k,p)+1)%p==0)
{
k+=(p+1)/2;
} }while(i%2==0);
x=pow(a,(i+1)/2,p)*pow(b,k/2,p)%p;
}
if(x*2>p)x=p-x;
return x;
}
int main()
{
freopen("t.txt","r",stdin);
LL np;
scanf("%lld",&np);
for(LL ii=1;ii<=np;ii++)
{
LL a,p;
scanf("%lld%lld",&a,&p);
a=(a%p+p)%p;
LL ans=MOD_sqr(a,p);
if(ans==-1)printf("Scenario #%lld:\n-1\n\n",ii);
else printf("Scenario #%lld:\n1\n\n",ii);
}
return 0;
}
POJ1808 平方(二次)同余方程的更多相关文章
- PAT 甲级 1078 Hashing (25 分)(简单,平方二次探测)
1078 Hashing (25 分) The task of this problem is simple: insert a sequence of distinct positive int ...
- Tensorflow2(二)tf.data输入模块
代码和其他资料在 github 一.tf.data模块 数据分割 import tensorflow as tf dataset = tf.data.Dataset.from_tensor_slice ...
- ZOJ3774_Power of Fibonacci
求fibonacci数列前N个数的K次方和. 通项公式:F[n]=((1+sqrt(5))/sqrt(5)-(1-sqrt(5))/sqrt(5))/sqrt(5). 有点乱,不过由于可以保证最后的结 ...
- python学习笔记之五:抽象
本文会介绍如何将语句组织成函数,还会详细介绍参数和作用域的概念,以及递归的概念及其在程序中的用途. 一. 创建函数 函数是可以调用,它执行某种行为并且返回一个值.用def语句即可定义一个函数:(并非所 ...
- 【算法】C语言趣味程序设计编程百例精解
C语言趣味程序设计编程百例精解 C/C++语言经典.实用.趣味程序设计编程百例精解(1) https://wenku.baidu.com/view/b9f683c08bd63186bcebbc3c. ...
- 【2017-03-13】Tsql 数学函数、字符串函数、转换函数、时间日期函数
一.数学函数(针对值类型操作) 1.ceiling():取上限 只要小数点后有数字大于0,整数位自动进1 2.floor():取下限 将小数点位舍去,不管小数点位大小 3.round(四舍五入的值,保 ...
- 1078. Hashing (25)【Hash + 探測】——PAT (Advanced Level) Practise
题目信息 1078. Hashing (25) 时间限制100 ms 内存限制65536 kB 代码长度限制16000 B The task of this problem is simple: in ...
- Miller Rabin 算法简介
0.1 一些闲话 最近一次更新是在2019年11月12日.之前的文章有很多问题:当我把我的代码交到LOJ上,发现只有60多分.我调了一个晚上,尝试用{2, 3, 5, 7, 11, 13, 17, 1 ...
- PKU 2002 Squares(二维点哈希+平方求余法+链地址法)
题目大意:原题链接 给定平面上的N个点,求出这些点一共可以构成多少个正方形. 解题思路: 若正方形为ABCD,A坐标为(x1, y1),B坐标为(x2, y2),则很容易可以推出C和D的坐标.对于特定 ...
随机推荐
- Python之面向对象函数式编程
Python之面向对象函数式编程 函数式编程的根本就是用 def 去模拟数学式的编程逻辑. 类似与 y = 2*x + 1 ,当x = 3 时,函数的结果y就得7. def test(x): retu ...
- 命令行下设置 PYTHONPATH 来正确运行Python代码
写Python程序,总要使用一些自己使用的库:在运行此类程序的时候,就需要先配置好 PYTHONPATH 环境变量:否则会导致找不到库错误. Windows下,可以写一个bat来简化配置: @ECHO ...
- HDU-1163Eddy's digital Roots,九余定理的另一种写法!
下午做了NYOJ-424Eddy's digital Roots后才正式接触了九余定理,不过这题可不是用的九余定理做的.网上的博客千篇一律,所以本篇就不发篇幅过多介绍九余定理了: 但还是要知道什么是九 ...
- HDU 1564 找规律博弈
题目大意是: 从n*n的方格角落的一个起点出发,每次移到上下左右一个未曾到达过的位置,谁不能走了谁就输了 想了好久都想不出,看了大神的题解 Orz了 果然博弈不是脑残的游戏啊... 这里从起点出发,将 ...
- [luoguP1040] 加分二叉树(DP)
传送门 区间DP水题 代码 #include <cstdio> #include <iostream> #define N 41 #define max(x, y) ((x) ...
- 解决Codeforces访问慢的本地方案
参考: http://m.blog.csdn.net/blog/Xiangamp/42245923#
- 【(待重做)树状数组+dp+离散化】Counting Sequences
https://www.bnuoj.com/v3/contest_show.php?cid=9149#problem/G [题意] 给定一个数组a,问这个数组有多少个子序列,满足子序列中任意两个相邻数 ...
- codeforces 691F(组合数计算)
Couple Cover, a wildly popular luck-based game, is about to begin! Two players must work together to ...
- 动态替换logback FileAppender/RollingFileAppender 配置- Programmatically configure logback FileAppender/RollingBackAppender
一.本文实际解决的问题 如何在代码中修改logback的RollingFileAppender配置(本文代码实例为修改日志文件路径) 二.针对的场景: 本文解决的问题属于一个大需求的一部分,需求为:需 ...
- Andorid使用WiFi 连接adb进行调试
无奈数据线连接常常掉线. 于是寻找wifi连接adb的方法,在github上搜索了一下client的源代码后编译后执行了下,发现能够行得通,于是记录一下. 相应的安卓client源代码在这wifi a ...