您的位置:首页 > 其它

hdu3292

2015-10-04 12:10 225 查看
佩尔方程,详见《数论概论》(原书第三版)

网上其他解题方法大都是用矩阵,其实快速幂也可以。

参考:http://blog.csdn.net/z690933166/article/details/9746843

(今天中午作为“娘家人”去见了队友的男朋友,尴尬,不知道该怎么办,希望没有给队友丢人



(我们都是小怪兽,有一天会被正义的奥特曼杀死。——江南 《龙族》           喜欢绘梨衣,萌萌哒)

2015.10.30:

哈哈哈

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
using namespace std;
#define MOD 8191

void km(int *ansx,int *ansy,int x,int y,int n,int k){
*ansx=1;
*ansy=0;
x=x%MOD;
y=y%MOD;

while(k){
if(k%2){
//*ansx=((*ansx)*x%MOD+(*ansy)*y%MOD*n%MOD)%MOD;
//*ansy=((*ansx)*y%MOD+x*(*ansy)%MOD)%MOD;//ansx的值已经变了,所以这样算不对
int tempx=((*ansx)*x%MOD+(*ansy)*y%MOD*n%MOD)%MOD;
int tempy=((*ansx)*y%MOD+x*(*ansy)%MOD)%MOD;
*ansx=tempx;
*ansy=tempy;
}
k=k/2;
/*x=(x*x%MOD+y*y%MOD*n*(这里应该是%MOD,结果写成了*,下面直接复制粘贴过去的,所以也一直错。)MOD)%MOD;
y=(x*y%MOD+x*y%MOD)%MOD;//x的值已经改变了,所以这样算不对
*/
int tempx=(x*x%MOD+y*y%MOD*n%MOD)%MOD;
int tempy=(x*y%MOD+x*y%MOD)%MOD;
x=tempx;
y=tempy;
//printf("%d %d\n",x,y);
}

return;
}

int main(){
int n,k;

while(scanf("%d%d",&n,&k)!=EOF){//没有写!=EOF,结果Output Limit Exceeded
int tempn=sqrt(n);

if(tempn*tempn==n){
printf("No answers can meet such conditions\n");
}
else{
int x,y;
int ansx,ansy;

for(int i=2;;i++){
int temp=i*i-1;
if(temp%n){
continue;
}
else{
temp=temp/n;

int temptemp=sqrt(temp);

if(temptemp*temptemp==temp&&temptemp>0){
x=i;
y=temptemp;
break;
}
}
}

//printf("%d %d\n",x,y);
km(&ansx,&ansy,x,y,n,k);

printf("%d\n",ansx);
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: