POJ-2115-C Looooops(扩欧)
作者:互联网
题目
题意: 对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次才会结束。若在有限次内结束,则输出循环次数。否则输出死循环。
题意不难理解,只是利用了 k位存储系统 的数据特性进行循环。例如int型是16位的,那么int能保存2^ 16个数据,即最大数为65535(本题默认为无符号),当循环使得i超过65535时,则i会返回0重新开始计数。如i=65534,当i+=3时,i=1。其实就是i=(65534+3)%(2^16)=1。
//输入A B C L
//原方程:(A+k*C)%mod=B; A+k*C=Y*mod+B;
//转化方程:C*k-mod*Y=B-A;
//ex_gcd(C,mod,k,Y) mod=quick_pow(2,L);
#include<iostream>
#include<algorithm>
#define en '\n'
using namespace std;
typedef long long ll;
const int M=5e5+5,N=4e4+5;
ll quick_pow(ll c,ll p)
{
ll res=1;
while(p)
{
if(p&1) res*=c;
c*=c,p>>=1;
}
return res;
}
ll ex_gcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=1,y=0;
return a;
}
ll tmp=ex_gcd(b,a%b,x,y);
ll r=x;
x=y,y=r-a/b*y;
return tmp;
}
int main()
{
ll A,B,C,L,x,y;
while(~scanf("%lld%lld%lld%lld",&A,&B,&C,&L),A||B||C||L)
{
L=quick_pow(2,L);
ll ans=ex_gcd(C,L,x,y);
if((B-A)%ans) puts("FOREVER");
else
{
x*=(B-A)/ans;
ll mod=L/ans;
printf("%lld\n",(x%mod+mod)%mod);
}
}
}
标签:gcd,int,ll,Looooops,POJ,ex,ans,2115,mod 来源: https://blog.csdn.net/qq_42576687/article/details/94387299