• <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>
            隨筆 - 97, 文章 - 22, 評論 - 81, 引用 - 0
            數(shù)據(jù)加載中……

            PKU 2720 Last Digits

            題目鏈接:http://poj.org/problem?id=2720
            /*
            題意:
                給定三個整數(shù) b, n, 和 i, 定義函數(shù) f(x) = b^f(x-1) 如果 x > 0, 并且 f(0)=1。
            要求計算 f(i) 的最后n為十進制整數(shù),并且要求輸出前導(dǎo)零。

            解法:
                二分求冪 + 歐拉函數(shù) + 素數(shù)篩選

            思路:
                除非b等于1的時候,否則,這個數(shù)列的增長速度很快,所以直接暴力是行不通的,這
            里我們用到數(shù)論的一個結(jié)論,a^b % c = a^ (b % phi(c) + phi(c)) % c,b < phi(c)。
            其中phi(c)是c的歐拉函數(shù),也就是小于等于c并且與之互質(zhì)的數(shù)的個數(shù)。
                于是當(dāng)b比較小的時候就可以直接采用二分求冪來做,當(dāng)b很大的時候就利用這個結(jié)論
            ,可以迅速將指數(shù)降下來。
                這題是海量數(shù)據(jù),如果每個數(shù)都直接算肯定會超時,我的做法是用一個數(shù)組保存下來
            ,而且保存的是n等于7的值,也就是保存了整數(shù)后7為,這樣可以少算6倍。最后再做處理
            ,注意前導(dǎo)零的處理。
            */


            #include 
            <iostream>

            using namespace std;

            #define maxn 3163
            bool f[maxn];
            int prime[maxn], size;
            int ten[8];

            void Init() {
                
            int i, j;
                f[
            0= f[1= 1;
                
            for(i = 2; i < maxn; i++{
                    
            if(!f[i]) {
                        prime[size
            ++= i;
                        
            for(j = i+i; j < maxn; j += i) {
                            f[j] 
            = 1;
                        }

                    }

                }

                ten[
            0= 1;
                
            for(i = 1; i <= 7; i++{
                    ten[i] 
            = ten[i-1* 10;
                }

            }


            int phi(int v) {
                
            int i;
                
            int ans = 1;
                
            for(i = 0; i < size; i++{
                    
            if(!(v % prime[i])) {
                        v 
            /= prime[i];
                        
            while(!(v % prime[i])) {
                            v 
            /= prime[i];
                            ans 
            *= prime[i];
                        }

                        ans 
            *= prime[i] - 1;

                        
            if(v == 1)
                            
            return ans;
                    }

                }

                
            return ans * (v - 1);
            }


            int Product_Mod(int a, int b, int mod) {
                
            int S = 0;
                
            while(b) {
                    
            if(b & 1{
                        S 
            = (S + a) % mod;            
                    }

                    b 
            >>= 1;
                    a 
            = (a + a) % mod;
                }

                
            return S;
            }


            #define ll __int64

            int Exp_Mod(ll a, int b, int mod) {
                ll v 
            = 1;
                
            while(b) {
                    
            if(b & 1{
                        v 
            *= a;
                        
            if(v >= mod)
                            v 
            %= mod;
                    }

                    b 
            >>= 1;
                    a 
            *= a;
                    
            if(a >= mod)
                        a 
            %= mod;
                }

                
            return v;
            }


            int hash[101][101];
            int F[101][101];
            int dfs(int b, int n, int mod) {
                
            if(n == 0)
                    
            return 1 % mod;
                
            if(mod == 1)
                    
            return 0;
                
            if(F[b][n] < 0{
                    
            int oula = phi(mod);
                    
            return Exp_Mod( b, dfs(b, n-1, oula) + oula, mod);
                }
            else {
                    
            return F[b][n] % mod;
                }

            }


            int Test(int b, int ex) {
                
            if(ex < 0)
                    
            return -1;

                
            int i;
                
            int sum = 1;
                
            for(i = 0; i < ex; i++{
                    sum 
            *= b;
                    
            if(sum >= ten[7])
                        
            return -1;
                }

                
            return sum;
            }




            int main() {
                Init();
                
            int i, j;
                
            int bew, n, mod, ans;
                memset(hash, 
            -1sizeof(hash));

                
            for(i = 1; i <= 100; i++{
                    F[i][
            0= 1;
                    
            for(j = 1; j <= 100; j++{
                        F[i][j] 
            = Test(i, F[i][j-1]);
                    }

                }


                
            while(scanf("%d"&bew) != EOF && bew) {
                    scanf(
            "%d %d"&n, &mod);

                    
            if(hash[bew][n] == -1{
                        
            if(bew == 1{
                            ans 
            = 1;
                        }
            else {
                            ans 
            = dfs(bew, n, ten[7]);
                        }

                        hash[bew][n] 
            = ans;
                    }

                    ans 
            = hash[bew][n] % ten[mod];

                    
            for(i = 1; i <= 7; i++{
                        
            if(ans < ten[i]) {
                            
            break;
                        }

                    }


                    
            for(i = mod-i; i ; i--{
                        printf(
            "0");
                    }

                    printf(
            "%d\n", ans);
                }

                
            return 0;
            }

            posted on 2011-04-07 20:02 英雄哪里出來 閱讀(1384) 評論(0)  編輯 收藏 引用 所屬分類: 數(shù)學(xué)

            久久天天躁狠狠躁夜夜不卡| 国产成人精品综合久久久久| 亚洲成人精品久久| 精品久久久久久久久久中文字幕 | 91精品婷婷国产综合久久| 久久精品国产99久久无毒不卡| 精品久久久噜噜噜久久久| 久久被窝电影亚洲爽爽爽| 99久久99久久精品国产片果冻| 奇米影视7777久久精品人人爽| 久久久无码精品午夜| 久久久免费精品re6| 久久久亚洲欧洲日产国码二区 | 久久精品免费一区二区| 久久精品国产亚洲AV无码麻豆| 国产无套内射久久久国产| 91精品国产色综合久久| 少妇无套内谢久久久久| 久久综合久久伊人| 久久综合色老色| 国产国产成人精品久久| 久久久人妻精品无码一区| 亚洲中文久久精品无码ww16| 久久综合香蕉国产蜜臀AV| 久久精品亚洲一区二区三区浴池| 伊人久久大香线蕉成人| 亚洲欧洲精品成人久久奇米网| 精品99久久aaa一级毛片| 久久精品人人做人人爽电影| 久久综合九色欧美综合狠狠| 久久WWW免费人成一看片| 国产精品热久久毛片| 亚洲AV无码久久精品狠狠爱浪潮 | 亚洲国产精品狼友中文久久久| 狠狠久久综合| 久久电影网一区| WWW婷婷AV久久久影片| 精品多毛少妇人妻AV免费久久| 国内精品久久久久久久97牛牛| 国产精品无码久久综合网| 久久免费的精品国产V∧|