• <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 閱讀(1515) 評論(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
            @威士忌
            你的代碼很清晰
            這么多版本中 你的好理解  回復  更多評論
              
            久久久久亚洲爆乳少妇无 | 99久久精品国产一区二区| 久久99国产精品久久99小说| 久久精品无码一区二区三区免费 | 青草影院天堂男人久久| 青青青伊人色综合久久| 久久久精品视频免费观看| 久久伊人影视| 嫩草伊人久久精品少妇AV| 久久精品无码专区免费东京热 | 久久久久久a亚洲欧洲aⅴ| 久久91这里精品国产2020| 无码人妻久久一区二区三区蜜桃| 亚洲欧美精品一区久久中文字幕 | 久久人人爽人人爽人人片av高请 | 狼狼综合久久久久综合网| 蜜桃麻豆www久久| 日韩AV毛片精品久久久| 久久午夜伦鲁片免费无码| 久久www免费人成精品香蕉| 99久久国产宗和精品1上映| 97久久国产亚洲精品超碰热| 久久久久久久综合综合狠狠| 久久亚洲欧美国产精品| 精品国产青草久久久久福利| 亚洲日本va中文字幕久久| 国内精品久久久久久麻豆| 色综合久久综合中文综合网| 国产一区二区三精品久久久无广告| 中文字幕乱码人妻无码久久 | 欧美久久一区二区三区| 精品熟女少妇av免费久久| 欧美激情精品久久久久久久九九九| 人妻久久久一区二区三区| 久久国产精品无| 国产成人香蕉久久久久| 麻豆AV一区二区三区久久| 久久人做人爽一区二区三区| 久久无码人妻精品一区二区三区| 久久大香香蕉国产| 97精品国产97久久久久久免费|