• <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>
            隨筆-6  評論-2  文章-0  trackbacks-0
            #include <iostream>
            using namespace std;
            int a,b,s[100];
            struct Pair
            {
                
            int x;
                
            int y;
            }res[
            50];
            int main()
            {
                
            int n,i,j,k;
                
            bool flag=false;
                res[
            0].x=res[0].y=1;
                
            while(cin>>a>>b>>n)
                {
                    
            if(!(a||b||n))return 0;
                    
            for(i=1;i<50;++i)
                    {
                        res[i].x
            =res[i-1].y;
                        res[i].y
            =(a*res[i-1].y+b*res[i-1].x)%7;
                        
            for(j=0;j<i-1;++j)//…………………………注意這里循環上限是i-1,這樣可以排除三個連續相等的情況。就是把循環節為1的看成2.
                        {
                            
            if(res[j].x==res[i].x&&res[j].y==res[i].y)
                            {
                                flag
            =true;
                                
            break;
                            }
                        }
                        
            if(flag)break;
                    }
            //一個循環找出循環節大小
                    flag=false;//……………………注意把標志還原
                    if(n<=j)cout<<res[n].x<<endl;//未進入循環時
                    else
                    {
                        
            if((n-j)%(i-j)==0)k=i-1;
                        
            else k=(n-j)%(i-j)+j-1;//這個式子改了很長時間,總是會出現問題。這是最終的形式
                        cout<<res[k].x<<endl;
                    }
                }
                
            return 0;
            }
            提交了七次終于給過了。是道數論的簡單題,不過應該用不到什么高深的知識,關鍵是找出循環節。因為對于1000000000的大小,如果不找規律的話無論如何也要超時的。分析一下,每個數僅取決于它前面的兩個,所以如果出現了相同的數對,則必出現循環。而且,每個數都是0~6之間的一個,可知不同的數對只有7*7=49個,那么只要計算出前50個數,則其中必有相同的兩對數出現。上代碼。AC之后我想知道循環是不是總是從最前面兩個數開始,于是簡單寫了一個程序,遍歷了所有的a,b(易知它們也只有49種組合),下面是我得到的結果:
            a b j i i-j
            0 0 2 4 2
            0 1 0 2 2
            0 2 0 6 6
            0 3 0 12 12
            0 4 0 6 6
            0 5 0 12 12
            0 6 0 4 4
            1 0 0 2 2
            1 1 0 16 16
            1 2 0 6 6
            1 3 0 24 24
            1 4 0 48 48
            1 5 0 21 21
            1 6 0 6 6
            2 0 1 4 3
            2 1 0 6 6
            2 2 0 48 48
            2 3 0 6 6
            2 4 0 48 48
            2 5 0 24 24
            2 6 0 2 2
            3 0 1 7 6
            3 1 0 16 16
            3 2 0 48 48
            3 3 0 42 42
            3 4 0 6 6
            3 5 0 2 2
            3 6 0 8 8
            4 0 1 4 3
            4 1 0 16 16
            4 2 0 48 48
            4 3 0 21 21
            4 4 0 2 2
            4 5 0 6 6
            4 6 0 8 8
            5 0 1 7 6
            5 1 0 6 6
            5 2 0 48 48
            5 3 0 2 2
            5 4 0 48 48
            5 5 0 24 24
            5 6 0 14 14
            6 0 1 3 2
            6 1 0 16 16
            6 2 0 2 2
            6 3 0 24 24
            6 4 0 48 48
            6 5 0 42 42
            6 6 0 3 3
            可見當a,b都是7的倍數時,循環從第三個數開始(以后都是0);當a,b中只有一個是7的倍數時,循環從第二個數開始(1,0、0,1的情況比較特殊,因為跟開始的1,1重復了所以可以認為是從第一個數開始);當a,b都不是7的倍數是,循環從第一個數開始。可見還是從第一個數開始循環的多。循環節也有長有短,比如當a=1,b=4時一直到第49個數才出現循環。

            posted on 2010-11-18 17:00 cometrue 閱讀(1507) 評論(2)  編輯 收藏 引用

            評論:
            # re: hdoj_1005_Number Sequence 2010-11-18 17:14 | 威士忌
            int main()
            {
            int A,B,n,i,j,num,m;
            int a[1000];
            while(scanf("%d %d %d",&A,&B,&n)!=EOF)
            {
            if(A==0 && B==0 && n==0)
            break;
            a[1]=1;a[2]=1;
            for(i=3;i<50;i++)
            a[i]=( A * a[i - 1] + B * a[i - 2]) % 7;
            m=1;
            for(j=3;j<50;j++)
            if(a[j]==1 && a[j-1]==1)
            break;
            j-=2;
            num=n%j;
            if(num==0)
            printf("%d\n",a[j]);
            else
            printf("%d\n",a[num]);
            }
            return 0;
            }  回復  更多評論
              
            # re: hdoj_1005_Number Sequence 2012-08-14 08:38 | curtius
            @威士忌
            你的代碼很清晰
            這么多版本中 你的好理解  回復  更多評論
              
            人妻丰满?V无码久久不卡| 97久久久久人妻精品专区| 久久精品国产福利国产秒| 亚洲中文字幕久久精品无码APP| 久久久久久噜噜精品免费直播| 国产精品gz久久久| 久久AⅤ人妻少妇嫩草影院| 久久国产成人亚洲精品影院| 精品国产青草久久久久福利 | 精品国产乱码久久久久软件| 久久夜色精品国产亚洲av| 国产综合免费精品久久久| 精品国产青草久久久久福利| 热综合一本伊人久久精品| 色播久久人人爽人人爽人人片AV| 久久妇女高潮几次MBA| 亚洲狠狠婷婷综合久久久久| 性高湖久久久久久久久| 久久久久久综合一区中文字幕| 好属妞这里只有精品久久| 久久久久久久久久久免费精品| 中文字幕无码久久人妻| 欧美va久久久噜噜噜久久| 久久久青草青青亚洲国产免观| 91久久精品无码一区二区毛片| 精品久久久久久国产牛牛app| 久久久久久久久久免免费精品 | 久久久久香蕉视频| 亚洲人成无码www久久久| …久久精品99久久香蕉国产| 久久久久亚洲AV成人网人人网站| 一级做a爰片久久毛片看看| 国产精品久久久久影院色| 久久久久亚洲AV无码去区首| 色综合久久久久综合体桃花网| 99久久99久久精品国产片| 人人妻久久人人澡人人爽人人精品| 国产精品久久久久久一区二区三区| 色青青草原桃花久久综合| 伊人色综合久久| 精品久久久久久亚洲|