poj_2115

来源:互联网 发布:数据挖掘的主要技术 编辑:程序博客网 时间:2024/06/10 20:33

源地址:http://poj.org/problem?id=2115

题目大意就是给四个数:A,B,C,K

求for(int i=A;i!=B;i+=C) 这个循环在存储单位是K位的系统里面能够循环几次?

存储单位是k位的意思就是当某个数到达了2^k这个上限后,会自动又从0开始(题目说了是无符号系统)。

化成公式,就是  C*x%(2^k) = B-A求x的最小值。

令 a=C,c=B-A,b=2^k,则 a*x = c(mod b),即a*x+b*y=c,求最小的x值。

这就化成了熟悉的线性方程,用扩展欧几里得算法即可。算得x后,

x1 = x*(c/d)就是一个解,而这个解不一定大于0,所以还得用b/d这个结果去取模运算。

#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#include<stack>#include<iterator>#include<math.h>#include<stdlib.h>#include<limits.h>#include<set>#include<map>//#define ONLINE_JUDGE#define eps 1e-8#define INF 0x7fffffff#define FOR(i,a) for((i)=0;i<(a);(i)++)#define MEM(a) (memset((a),0,sizeof(a)))#define sfs(a) scanf("%s",a)#define sf(a) scanf("%d",&a)#define sfI(a) scanf("%I64d",&a)#define pf(a) printf("%d\n",a)#define pfI(a) printf("%I64d\n",a)#define pfs(a) printf("%s\n",a)#define sfd(a,b) scanf("%d%d",&a,&b)#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)#define for1(i,a,b) for(int i=(a);i<b;i++)#define for2(i,a,b) for(int i=(a);i<=b;i++)#define for3(i,a,b)for(int i=(b);i>=a;i--)#define MEM1(a) memset(a,0,sizeof(a))#define MEM2(a) memset(a,-1,sizeof(a))const double PI=acos(-1.0);template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}template<class T> inline T Min(T a,T b){return a<b?a:b;}template<class T> inline T Max(T a,T b){return a>b?a:b;}using namespace std;#define ll __int64int n,m;#define Mod 1000000007#define N 510#define M 1000100const int size = 46340+4;const int mod = 9901;ll A,B,C,k;ll x,y;ll extend_gcd(ll a,ll b){if(b == 0){x = 1;y = 0;return a;}else{ll p = extend_gcd(b,a%b);ll t = x;x = y;y = t-a/b*y;return p;}}int main(){#ifndef ONLINE_JUDGE    freopen("in.txt","r",stdin);//  freopen("out.txt","w",stdout);#endif    while(scanf("%I64d%I64d%I64d%I64d",&A,&B,&C,&k)!=EOF){    if(A==0 && B==0 && C==0 && k==0)    break;    ll b = (1ll<<k);    ll c = B-A;    ll d = extend_gcd(C,b);    if(c%d){<span style="white-space:pre"></span>//方程无解    printf("FOREVER\n");    continue;    }    x = (x*(c/d))%b;    ll ans;    ans = (x%(b/d)+(b/d))%(b/d);//    printf("%I64d\n",ans);    }return 0;}


0 0
原创粉丝点击