青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 97, 文章 - 22, 評論 - 81, 引用 - 0
數據加載中……

HDU 1066 Last non-zero Digit in N!

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1066
/*
題意:
    給定一個數N(N <= 10^200),求出N的階乘的最后一位非零數字。

題解:
    找規律 + 大數模擬

思路:
    N比較大,我一開始寫了一個log5(N)*log2(N)的算法都超時了。關鍵還是找
規律,對于一個給定的 N,可以先將所有是5的倍數的數提出來先放在一邊不管。
并且將原來是5的倍數的位置補上1 ,那么可以原來的序列就變成了0 1 2 3 4 1
 6 7 8 9 1,現在我們將前10個數的階乘去掉5之后的尾數列出來,得到以下
的表data[09] = {1, 1, 2, 6, 4, 4, 4, 8, 4, 6}。我們驚人的發現第一位
是1,最后一位是6,于是大膽的假設如果將N個數每10個分成1組(這個N個數已經
去掉了5的倍數),每組的尾數相乘都是data[09],并且如果第一組和第二組
都是10個元素,他們相乘的值還是6,這是顯然的。因為6*6 = 6,所以這一部分
的乘積X[N]就可以通過N的尾數來確定,我們有如下公式:

  1. X[N] = data[N]          當N  < 10
  2. X[N] = data[N%10] * 6   當N >= 10
其中X[N]表示1N個數中去掉所有5的倍數后的乘積。

    然后再來看5的倍數那一部分,它們是:5*10 * 15 * 20 * 25 * 30 * 35
我們發現將他們提取公因子,可以寫成 5^P * P!。其中P = [N/5],因為求得是
階乘最后一位非零位,所以這里的5^P必須要用P個2來匹配掉,如果將最后的非零
為記為T[N]的話,那么T[N] = (X[N] / 2^P) * T[P]; 這里的除法不是不同意義
的除法,因為X[N]有可能是1位數,我們發現:
2^1 % 10 = 2,
2^2 % 10 = 4,
2^3 % 10 = 8,
2^4 % 10 = 6,
每四個一循環,當P == 0的時候比較特殊,2^P % 10 = 1
除上2^P其實就是乘上2^(-P),這樣處理就簡單了,根據循環的性質就可以將T[N]
簡化成T[N] = X[N] * 2^(-P) * T[P],這樣一來,算法的復雜度就只有O(log5(N))
了。并且2是每四個一循環,2^(-P) = 2^(-P % 4 + 4)。
    計算T[N]只需要遞歸計算T[N/5]即可。
*/

#include 
<iostream>
using namespace std;

typedef __int64 ll;
const ll Base     = (ll)100000000 * (ll)1000000000;

ll val_pro[
20];
ll carry_pro[
5];

int TwoMod[] = {2486};
// 將5的倍數部分補1后的階乘尾數
int data[] = {1126444846};

struct BigNum {
    ll nData[
14];
    
int nLen;

    BigNum()
{nLen = 0;}
    BigNum(
char *str);

    
int  ModFour();
    
int  ModTen();
    
void DivideFive();
    
void DivideTwo();

    
bool operator==(BigNum b) {
        
if(nLen != b.nLen) return false;
        
int i;
        
for(i = 0; i < nLen; i++{
            
if(nData[i] != b.nData[i])
                
return false;
        }

        
return true;
    }


    
void print(){
        printf(
"%d",nLen==0?0:nData[nLen-1]);
        
for(int i=nLen-2;i>=0;i--)
            
for(ll j=Base/10;j>0;j/=10)
                printf(
"%d",nData[i]/j%10);
        puts(
"");
    }


}
;

BigNum::BigNum(
char *S) {
    
int i, j = 0;
    nData[nLen 
= 0= 0;
    
for (i = strlen(S)-1; i >= 0--i) {
        nData[nLen] 
+= (S[i] - '0'* val_pro[j];
        
++j;
        
if (val_pro[j] >= Base) j = 0, nData[++nLen] = 0;
    }

    
if (nData[nLen] > 0++nLen;
}


int BigNum::ModFour() {
    
if(!nLen)
        
return 0;
    
return nData[0% 4;
}

int BigNum::ModTen() {
    
if(!nLen)
        
return 0;
    
return nData[0% 10;
}


void BigNum::DivideFive() {
    
if(!nLen)
        
return ;
    
int i;
    
for(i = nLen-1; i >= 0--i) {
        
int nCarry = (nData[i] % 5);
        nData[i] 
/= 5;
        
if(nCarry && i) {
            nData[i
-1+= carry_pro[ nCarry ];
        }

    }

    
if(!nData[nLen-1])
        
-- nLen;

    
return ;
}


void BigNum::DivideTwo() {
    
if(!nLen)
        
return ;
    
int i;
    
for(i = nLen-1; i >= 0; i--{
        
int nCarry = (nData[i] & 1);
        nData[i] 
>>= 1;
        
if(i && nCarry) {
            nData[i
-1+= Base;
        }

    }

    
if(!nData[nLen-1])
        
-- nLen;
    
return ;
}



int FindNoneZeroTail(BigNum Bn) {
    
if(!Bn.nLen)
        
return 1;
    
if(Bn.nLen == 1{
        
if(Bn.nData[0< 5{
            
return data[ Bn.nData[0] ];
        }
else if(Bn.nData[0< 10){
            
return data[ Bn.nData[0] ] * TwoMod[2% 10;
        }

    }


    
int v = Bn.ModTen();
    Bn.DivideFive();

    
int XN = data[v] * 6 % 10;
    
int idx = 4 - Bn.ModFour();
    
if(idx == 0{
        idx 
= 4;
    }

    XN 
*= TwoMod[idx - 1];
    
return XN * FindNoneZeroTail(Bn) % 10;
}



char str[10000];

int main() {
    
int i, j;
    val_pro[
0= 1;
    
for(i = 1; i < 20; i++)
        val_pro[i] 
= val_pro[i-1* 10;
    
for(i = 0; i < 5; i++)
        carry_pro[i] 
= i * Base;

    
while(scanf("%s", str) != EOF) {
        BigNum X(str);
        printf(
"%d\n", FindNoneZeroTail(X));
    }


    
return 0;
}


posted on 2011-04-11 12:11 英雄哪里出來 閱讀(2511) 評論(0)  編輯 收藏 引用 所屬分類: 數學

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品拍天天在线| 国内一区二区三区| 在线午夜精品自拍| 日韩香蕉视频| 欧美四级在线| 欧美在线综合视频| 久久久久久久一区| 亚洲破处大片| 一区二区电影免费观看| 欧美午夜女人视频在线| 欧美一区在线直播| 久久精品国产清自在天天线 | 亚洲第一成人在线| 免费观看亚洲视频大全| 99这里只有精品| 亚洲一区二区三区免费视频| 国产手机视频一区二区| 免费在线成人| 国产精品videosex极品| 久久久女女女女999久久| 欧美18av| 性高湖久久久久久久久| 蜜臀a∨国产成人精品| 亚洲一区二区三区激情| 久久精品一本| 亚洲图片在线观看| 久久精品盗摄| 亚洲一区二区三区在线观看视频| 亚洲欧美一区二区三区极速播放| 亚洲国产日韩一区二区| 这里只有视频精品| 亚洲福利在线看| 亚洲一区激情| 亚洲六月丁香色婷婷综合久久| 亚洲视频播放| 亚洲美女电影在线| 久久aⅴ国产紧身牛仔裤| 日韩一级在线| 久久精品亚洲国产奇米99| 亚洲一区二区三区在线视频| 久久综合给合久久狠狠色| 欧美影院精品一区| 欧美日韩第一区| 六月婷婷久久| 国产欧美短视频| 99精品视频一区| 在线日韩成人| 久久国产精品久久久久久| 亚洲欧美国产三级| 欧美日韩1区| 欧美激情一二三区| 精品动漫3d一区二区三区免费版 | 性欧美暴力猛交另类hd| 欧美日本一道本| 欧美国产日韩精品| 一区二区三区中文在线观看| 亚洲欧美在线另类| 午夜精彩国产免费不卡不顿大片| 欧美福利一区二区| 欧美激情精品久久久久| 在线电影欧美日韩一区二区私密| 午夜精品国产更新| 香蕉久久夜色精品| 国产精品国产三级国产专播精品人| 亚洲国产一区在线| 亚洲精品国产视频| 欧美成人亚洲成人| 亚洲欧洲久久| 99天天综合性| 欧美日韩精品三区| 99精品国产福利在线观看免费 | 最近中文字幕mv在线一区二区三区四区| 欧美一区二区女人| 久久激情视频| 精品999久久久| 久久人人九九| 亚洲国产一成人久久精品| 亚洲美洲欧洲综合国产一区| 久久久久国产免费免费| 欧美在线视频网站| 亚洲国产成人久久综合| 久久伊人免费视频| 亚洲国产视频一区二区| 亚洲美女在线观看| 欧美午夜不卡| 亚洲欧美色一区| 久久在线免费| 日韩视频在线一区| 国产精品精品视频| 欧美一区二区三区免费在线看| 久久九九免费视频| 亚洲国产精品国自产拍av秋霞| 欧美极品欧美精品欧美视频| 国产精品99久久久久久有的能看| 久久av在线| 亚洲精品美女免费| 国产毛片精品国产一区二区三区| 久久精品一区中文字幕| 亚洲激情av在线| 欧美一级理论片| 在线播放日韩| 国产精品成人一区二区网站软件| 午夜精品成人在线| 亚洲第一福利视频| 午夜精品三级视频福利| 在线播放一区| 欧美日韩中文字幕在线视频| 久久动漫亚洲| 一本大道av伊人久久综合| 久久精品理论片| 亚洲乱码国产乱码精品精98午夜| 国产精品网站视频| 欧美激情久久久久| 久久精品国产99国产精品澳门| 亚洲久久在线| 麻豆国产精品777777在线| 亚洲特级片在线| 亚洲国产精品高清久久久| 国产精品免费福利| 欧美精品在线观看播放| 欧美主播一区二区三区| aⅴ色国产欧美| 亚洲黄色成人| 免费不卡在线观看av| 午夜精品www| 99成人免费视频| 亚洲国产成人av| 国语自产精品视频在线看8查询8 | 午夜欧美精品| 亚洲一级在线| 一区二区欧美亚洲| 亚洲精品欧美专区| 欧美激情第8页| 欧美大片91| 免费成人在线视频网站| 久久人人97超碰国产公开结果| 校园春色综合网| 亚洲欧美日韩精品久久| 亚洲午夜激情| 亚洲主播在线| 亚洲专区一二三| 亚洲欧美精品中文字幕在线| 99这里有精品| 在线视频精品一| aa级大片欧美三级| 一本色道久久加勒比88综合| 亚洲精品日韩激情在线电影 | 国产精品成人午夜| 欧美视频一区二区三区四区| 欧美日韩免费高清| 欧美性生交xxxxx久久久| 欧美日韩一区二区三区四区在线观看 | 亚洲天堂网站在线观看视频| 在线视频你懂得一区| 亚洲视频欧美视频| 亚洲制服少妇| 欧美怡红院视频| 久久亚洲国产成人| 嫩草影视亚洲| 欧美日韩亚洲一区二区三区在线观看 | 欧美日韩免费视频| 国产精品大片免费观看| 国产精品丝袜白浆摸在线| 国产精品一区视频网站| 国产综合在线视频| 亚洲丶国产丶欧美一区二区三区| 亚洲福利一区| 亚洲先锋成人| 欧美专区第一页| 免费中文字幕日韩欧美| 欧美激情一区二区三区蜜桃视频| 亚洲激情电影中文字幕| 亚洲深夜福利在线| 久久国内精品自在自线400部| 麻豆国产精品一区二区三区| 欧美日韩国产精品一区| 国产欧美日韩一区二区三区在线| 国产一区亚洲一区| 亚洲精品一区二区三区四区高清| 亚洲欧美国产高清va在线播| 开心色5月久久精品| 亚洲国产天堂久久国产91| 亚洲一区亚洲| 欧美成人a∨高清免费观看| 国产精品一区二区欧美| 亚洲黄色小视频| 欧美一区二区三区四区视频| 欧美激情一区二区三区高清视频| 亚洲视频在线免费观看| 久久综合亚州| 国产日韩欧美一区二区三区在线观看| 亚洲高清在线| 久久成人免费网| 亚洲另类在线一区| 久久久久久久精| 国产精品揄拍500视频| 亚洲日本va午夜在线电影| 久久精品123| aⅴ色国产欧美| 欧美激情导航|