标签:来源 plm field contains 强制转换 sep finish while integer
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 35461 | Accepted: 10372 |
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
Source
//poj2115 //一句话题意,问循环多少次后停止,如果循环此处超过2^k,则%2^k; //假设循环x次(A+Cx)%2^k=B,得Cx+2^ky=B-A //(A+Cx)%2^k=B,即B= (A+Cx)-(A+Cx)/ 2^k*2^k //令 (A+Cx)/ 2^k=y,则有 B= (A+Cx)-2^k*y,得B-A=Cx-2^k*y //令y=-y,则有 Cx+2^ky=B-A #include<iostream> #include<cstdio> using namespace std; long long A,B,C,k; long long a,b,c,g,x,y; void exgcd(long long a,long long b){ if(b==0){//ax+0y=a,可以约定y=0,x只能为1 g=a;//全局变量 x=1;//全局变量 y=0;//全局变量 return ; } exgcd(b,a%b); long long z=x; x=y; y=z-a/b*y; } int main(){ while (1){ scanf("%d%d%d%d",&A,&B,&C,&k); if (A==0&&B==0&&C==0&&k==0) return 0; long long te=1; a=C; b=te<<k;//注意1<<31位是负数,因为默认1是int,最高位是符号位,此时可以long long(1)<<31,将1的存储空间强制转换为长整型。 c=B-A; exgcd(a,b); if(c%g!=0)printf("FOREVER\n"); else{ x=x*c/g;//ax+by=c 与 ax+by=gcd(a,b)的关系 long long t=b/g;//符合ax+by的解x的公差是b/g. //cout<<g<<" "<<t<<endl; x=(x%t+t)%t;//保证解x是正数。 printf("%lld\n",x);//注意输出的是长整型 } } return 0; }
标签:来源 plm field contains 强制转换 sep finish while integer
原文地址:https://www.cnblogs.com/ssfzmfy/p/11186764.html