• <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
            @威士忌
            你的代碼很清晰
            這么多版本中 你的好理解  回復  更多評論
              
            久久婷婷五月综合色99啪ak | 久久香蕉国产线看观看精品yw| 超级碰碰碰碰97久久久久| yy6080久久| 亚洲国产精品一区二区久久| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久精品国产亚洲77777| 久久99久久99小草精品免视看| 国产精品美女久久久免费 | 91精品国产综合久久久久久| 久久久免费观成人影院| 久久99精品久久久久久动态图| 久久亚洲天堂| 久久最近最新中文字幕大全| 久久这里有精品| 狠狠精品久久久无码中文字幕 | 亚洲午夜久久久久久久久电影网| 国产精品99久久久久久www| 久久久久亚洲AV成人片| 久久婷婷人人澡人人爽人人爱| 亚洲国产精品久久66| 国产精品久久午夜夜伦鲁鲁| 伊人久久大香线蕉精品不卡| 国产高潮国产高潮久久久91| 久久综合欧美成人| 久久国产精品久久精品国产| 欧美一区二区三区久久综 | 91精品国产综合久久香蕉| 浪潮AV色综合久久天堂| 2020国产成人久久精品| 久久伊人精品一区二区三区| 深夜久久AAAAA级毛片免费看| 99精品久久久久久久婷婷| 青青国产成人久久91网| 亚洲国产精品久久久久久| 94久久国产乱子伦精品免费| 国产成人精品久久一区二区三区av | 2022年国产精品久久久久| 亚洲色婷婷综合久久| 久久精品人人做人人妻人人玩| 久久久无码人妻精品无码|