• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            我叫張小黑
            張小黑的掙扎生活
            posts - 66,  comments - 109,  trackbacks - 0
            我的青蛙終于過了
            完全忘了算法導論上說的理論了~~其實以前寫的就只有一個小錯誤
            ax+ny=b;
            當求解x時,我們先用擴展歐幾里德extended_eculid(a,n,&x',&y');
            通過計算的x'和y'來計算x
            x可能沒解,也可能有d個不同的解
            當求解某些問題的時候,我們要求得到最小正解,如果x'*(b/d)<0時,我們應該在此解的基礎上繼續加n/d
            青蛙問題我就是這里錯了,我是在最小解的基礎上加n,
            最好不要忘了對n取模。
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1061
            //SA-SB=kL(k為整數)
            //SA=x+pm  SB=y+pn
            //(x-y)+p(m-n)=kL
            //p(n-m)+kL=x-y
            //ax+by=n<=>a'x+b'y=n/gcd(a,b)(此時a'與b'互質)
            //若x0,y0為歐幾里得所得解
            //x=x0+b't   y=y0-a't
            #include<iostream>
            __int64 Ext_Euclid(__int64 a,__int64 b,__int64
            * x,__int64* y)
            {
                __int64 p,q,d;
                
            if(a==0){*x=0;*y=1;return b;}
                
            if(b==0){*x=1;*y=0;return a;}
                d
            =Ext_Euclid(b,a%b,&p,&q);
                
            *x=q;
                
            *y=p-(a/b)*q;
                return d;
            }
            int main()
            {
                
            /*freopen("1.IN","r",stdin);
                freopen(
            "my.OUT","w",stdout);*/
                __int64 x,y,m,n,l;
            //x為A的起始點,y為B的起始點
                
            //m為x的步長,n為y的步長,l為緯度長
                __int64 c,a,d;
                __int64 p,q;
                
            while(scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&l)!=EOF){
                
            if(n==m)printf("Impossible\n");
                
            else {
                    
            if(m>n){a=m-n;c=y-x;}
                    
            else {a=n-m;c=x-y;}
                    d
            =Ext_Euclid(a,l,&p,&q);
                    
            if((x>y?(x-y):(y-x))%d)printf("Impossible\n");
                    
            else {
                        p
            *=c/d;
                        
            while(p<0)p+=l/d;//這里錯了,最小的那個不是這么加的
                        p
            =p%l;
                        printf(
            "%I64d\n",p);
                    }
                }}
                return 
            0;
            }

            E Encrypted
            這道題就是簡單的應用擴展的歐幾里德,并不涉及模線性方程
            #include<iostream>
            #define MaxN 
            100005
            char word[MaxN];
            int data[MaxN],keys[MaxN];
            typedef struct node{
               
            int d;
                 
            int x;
                
            int y;
            void operator
            =(node b)
            {
                d
            =b.d;
                x
            =b.x;
                y
            =b.y;
            }}NODE;
            NODE EXTENDED_EUCLID(
            int a,int b)
            {
                NODE first,sec;
                
            if(b==0){
                    sec.d
            =a;
                    sec.x
            =1;
                    sec.y
            =0;
                    return sec;
                }
                first
            =EXTENDED_EUCLID(b,(a%b+b)%b);
                sec.d
            =first.d;
                sec.x
            =first.y;
                sec.y
            =first.x-(a/b)*first.y;
                return sec;
            }
            int main()
            {
                
            int n,i;
                node tmp;
                
            while(scanf("%s",word)!=EOF){
                    memset(data,
            0,sizeof(data));
                    memset(keys,
            0,sizeof(keys));
                    
            int len=strlen(word);
                    scanf(
            "%d",&n);
                    
            for(i=0;i<n;i++)
                        scanf(
            "%d",&data[i]);
                    
            for(i=0;i<n;i++)
                        scanf(
            "%d",&keys[i]);
                    
            for(i=0;i<n;i++){
                        tmp
            =EXTENDED_EUCLID(data[i],keys[i]);
                        
            while(tmp.x<0)
                            tmp.x
            +=keys[i]/tmp.d;
                        printf(
            "%c",word[tmp.x%len]);
                    }
                    printf(
            "\n");
                }
                return 
            0;
            }
            posted on 2008-04-08 00:42 zoyi 閱讀(196) 評論(0)  編輯 收藏 引用 所屬分類: acm比賽總結
            歡迎光臨 我的白菜菜園

            <2008年1月>
            303112345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(8)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            acmer

            online judge

            隊友

            技術

            朋友

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲狠狠婷婷综合久久久久| 久久99精品国产麻豆婷婷| 无码人妻久久一区二区三区免费丨| 日韩人妻无码一区二区三区久久| 久久亚洲精品成人AV| 精品久久久久久久久久久久久久久| 久久伊人色| 国内精品久久久久久99蜜桃| 久久精品成人免费网站| 国产精品乱码久久久久久软件| 热久久国产精品| 欧美一区二区三区久久综| 久久99久久成人免费播放| 久久久久亚洲AV成人片| 久久久精品国产| 亚洲国产成人久久精品影视| 婷婷久久精品国产| 国产V综合V亚洲欧美久久| 久久亚洲AV成人无码软件| 国产精品九九久久免费视频 | 久久噜噜久久久精品66| 久久狠狠高潮亚洲精品| 精品综合久久久久久97| 亚洲国产精品综合久久一线| 精品久久久久久国产牛牛app| 国产精品9999久久久久| 久久99精品久久久久子伦| av色综合久久天堂av色综合在| 色天使久久综合网天天| 久久久久婷婷| 色综合合久久天天给综看| 久久国产视频99电影| 久久久久黑人强伦姧人妻| 99久久精品国产一区二区| 99久久精品国产综合一区| 99久久精品国产一区二区| 国产欧美一区二区久久| 大美女久久久久久j久久| A级毛片无码久久精品免费| 精品国产青草久久久久福利| 久久亚洲2019中文字幕|