标签:c looooops poj2115 扩展欧几里德 欧几里德 数论
Description
for (variable = A; variable != B; variable += C) statement;
Input
Output
Sample Input
3 3 2 16 3 7 2 16 7 3 2 16 3 4 2 16 0 0 0 0
Sample Output
0 2 32766 FOREVER
.
.
.
题意:for(i=A;i!=B;i+=C){i%(2^k)};问你循环执行几次?
思路:先假设等式成立:(A+x*C)%(2^k)=B
变形(2^k)*y+B=A+C*x ==> C*x+(-(2^k)*y)=B-A;
ax+by=c
所以现在你知道怎么做了吧。哈哈!
转载请注明出处:http://www.cnblogs.com/yuyixingkong/
题目链接:http://poj.org/problem?id=2115
#include<stdio.h> #define LL unsigned long long void exgcd(LL a,LL b,LL& d,LL& x,LL& y) { if(!b){d=a;x=1;y=0;} else { exgcd(b,a%b,d,y,x); y-=x*(a/b); } } int main() { LL A,B,C,k; while(scanf("%llu%llu%llu%llu",&A,&B,&C,&k),(A+B+C+k)) { LL a,b,c,d,x,y,dm; c=B-A; if(c==0){printf("0\n");continue;} a=C; b=(LL)1<<k; exgcd(a,b,d,x,y); if(c%d){ printf("FOREVER\n");continue;} dm=b/d; x=(((x*c/d)%dm)+dm)%dm; printf("%llu\n",x); } return 0; }
标签:c looooops poj2115 扩展欧几里德 欧几里德 数论
原文地址:http://blog.csdn.net/u010579068/article/details/45441005