2009年10月12日 星期一

TIOJ 1135 2.止不住的迴圈

poao899    -4K    15MS    G++     0.84K     2009-10-13 00:13:42                                           .

這題目(對我而言)好凶狠= =


在此跟TIOJ說聲抱歉吃了我那麼多爛code

58880poao8991135Accepted-4K15MSG++0.84K2009-10-13 00:13:42
58879__1135Accepted-4K15MSG++1.17K2009-10-13 00:12:59
58878__1135Runtime Error  G++1.1K2009-10-13 00:07:52
58877__1135Runtime Error  G++1.08K2009-10-13 00:06:26
58874__1135Runtime Error  G++1.07K2009-10-12 23:53:43
58873__1135Runtime Error  G++1.05K2009-10-12 23:52:55
58872__1135Runtime Error  G++1.05K2009-10-12 23:52:37
58870__1135Output Limit Exceed  G++1.0K2009-10-12 23:50:44
58869__1135Output Limit Exceed  G++1.0K2009-10-12 23:50:26
58868__1135Output Limit Exceed  G++1.03K2009-10-12 23:50:03
58867__1135Runtime Error  G++1.0K2009-10-12 23:49:28
58865__1135Runtime Error  G++1.0K2009-10-12 23:49:07
58864__1135Runtime Error  G++0.96K2009-10-12 23:48:34
58863__1135Runtime Error  G++0.98K2009-10-12 23:48:19
58862__1135Runtime Error  G++1.0K2009-10-12 23:47:57
58861poao8991135Runtime Error  G++1.01K2009-10-12 23:47:32
58860poao8991135Runtime Error  G++1.01K2009-10-12 23:46:39
58859poao8991135Runtime Error  G++1.01K2009-10-12 23:46:16
58856poao8991135Runtime Error  G++0.96K2009-10-12 23:40:05



整數線性組合的題目。

簡單紀錄一下解法好了XD


以下雷很大不喜者勿入


輸入有四個數字 a,b,c,k

依題目意思可以知道是找出

a + nc = m(2^k) + b

其中n為正整數,m為整數

整理一下會發現

nc + m(2^k) = b - a

即是做出c跟2^k的線性組合 湊成b-a

然後幾個要點

0. c有可能是0= =    就是這點讓我RE好幾遍QQ

1. 如果 gcd(c,2^k) 不是(b-a)的因數 直接輸出FOREVER

2.線性組合做出來是

pc + q(2^k) = gcd(c,2^k)

兩邊同乘就可以得到(b-a)的線性組合

不過要注意

I. n<0

II. n並非合理之最小  正  整數



大概就這樣了XD


以下code  一堆冗贅東西很礙眼

//********************************************

#include<stdio.h>
long long p,q,n;
long long gcd(long long a,long long b){
    static int x=0;
    if(a%b==0){
        p=0;q=1;
        return b;
    }
    long long c,g;
    long long tp,tq;
    c=a%b;
    g=gcd(b,c);
    n=a/b;
    tp=p;tq=q;
    p=tq;
    q=tp-n*tq;
    return g;
}

//(pow[k]-1)p+cq=gcd()

int a,b,c,k,t;
long long an,bn;
long long pow[64];
main(){
   
    pow[0]=1;
    for(int i=1;i<60;i++)
        pow[i]=pow[i-1]*2;
    scanf("%d",&t);
   
    while(t--){
        scanf("%d%d%d%d",&a,&b,&c,&k);
        if(c==0){
            a==b?puts("0"):puts("FOREVER");
            continue;
        }
        long long g=gcd(pow[k],c);
       
        if(b==a){
            puts("0");
            continue;
        }
        if((long long)(b-a)%g!=0){
            puts("FOREVER");
            continue;
        }
        an=c/g;
        bn=(pow[k])/g;
        long long rp=p*((b-a)/g),rq=q*((b-a)/g);
        if(rq<0){
            rq+=((-rq)-1+bn)/bn*bn;
        }
        rq-=rq/bn*bn;
        printf("%I64d\n",rq);
    }
}


沒有留言:

張貼留言