标签:des style blog http color os io strong
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
考察扩展欧几里得算法:
#include <stdio.h>
#include <math.h>
long long extended_euclid(long long a, long long b, long long &x, long long &y )
{
if(b==0)
{
x=1;
y=0;
return a; //d=a,x=1,y=0,此时等式d=ax+by成立
}
int d=extended_euclid(b, a%b, x, y );
int xt=x;
x=y;
y=xt-a/b*y;
return d;
}
int main()
{
int A, B, C, k;
long long a, b, c;
long long n;
while(scanf("%d %d %d %d", &A, &B, &C, &k)!=EOF)
{
if(A==0 && B==0 && C==0 && k==0)
break;
n=1;
for(int i=1; i<=k; i++)
{
n=n*2;
}
a=C;
b=B-A;
long long x, y;
long long d=extended_euclid (a, n, x, y );
if(b%d!=0) //无解
{
printf("FOREVER\n");
continue ;
}
x=(x*(b/d))%n;
x=(x%(n/d)+n/d)%(n/d);
printf("%lld\n", x);
}
return 0;
}
别人写的的代码+解析:
#include<iostream>
using namespace std;
//d=ax+by,其中最大公约数d=gcd(a,n),x、y为方程系数,返回值为d、x、y
__int64 EXTENDED_EUCLID(__int64 a,__int64 b,__int64& x,__int64& y)
{
if(b==0)
{
x=1;
y=0;
return a; //d=a,x=1,y=0,此时等式d=ax+by成立
}
__int64 d=EXTENDED_EUCLID(b,a%b,x,y);
__int64 xt=x;
x=y;
y=xt-a/b*y; //系数x、y的取值是为满足等式d=ax+by
return d;
}
int main(void)
{
__int64 A,B,C,k;
while(scanf("%I64d %I64d %I64d %I64d",&A,&B,&C,&k))
{
if(!A && !B && !C && !k)
break;
__int64 a=C;
__int64 b=B-A;
__int64 n=(__int64)1<<k; //2^k
__int64 x,y;
__int64 d=EXTENDED_EUCLID(a,n,x,y); //求a,n的最大公约数d=gcd(a,n)和方程d=ax+by的系数x、y
if(b%d!=0) //方程 ax=b(mod n) 无解
cout<<"FOREVER"<<endl;
else
{
x=(x*(b/d))%n; //方程ax=b(mod n)的最小解
x=(x%(n/d)+n/d)%(n/d); //方程ax=b(mod n)的最整数小解
printf("%I64d\n",x);
}
}
return 0;
}
POJ 2115 C Looooops,布布扣,bubuko.com
标签:des style blog http color os io strong
原文地址:http://www.cnblogs.com/yspworld/p/3897889.html