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

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

HDU 1066 Last non-zero Digit in N!

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

題解:
    找規(guī)律 + 大數(shù)模擬

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

  1. X[N] = data[N]          當(dāng)N  < 10
  2. X[N] = data[N%10] * 6   當(dāng)N >= 10
其中X[N]表示1N個(gè)數(shù)中去掉所有5的倍數(shù)后的乘積。

    然后再來看5的倍數(shù)那一部分,它們是:5*10 * 15 * 20 * 25 * 30 * 35
我們發(fā)現(xiàn)將他們提取公因子,可以寫成 5^P * P!。其中P = [N/5],因?yàn)榍蟮檬?br>階乘最后一位非零位,所以這里的5^P必須要用P個(gè)2來匹配掉,如果將最后的非零
為記為T[N]的話,那么T[N] = (X[N] / 2^P) * T[P]; 這里的除法不是不同意義
的除法,因?yàn)閄[N]有可能是1位數(shù),我們發(fā)現(xiàn):
2^1 % 10 = 2,
2^2 % 10 = 4,
2^3 % 10 = 8,
2^4 % 10 = 6,
每四個(gè)一循環(huán),當(dāng)P == 0的時(shí)候比較特殊,2^P % 10 = 1
除上2^P其實(shí)就是乘上2^(-P),這樣處理就簡單了,根據(jù)循環(huán)的性質(zhì)就可以將T[N]
簡化成T[N] = X[N] * 2^(-P) * T[P],這樣一來,算法的復(fù)雜度就只有O(log5(N))
了。并且2是每四個(gè)一循環(huán),2^(-P) = 2^(-P % 4 + 4)。
    計(jì)算T[N]只需要遞歸計(jì)算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的倍數(shù)部分補(bǔ)1后的階乘尾數(shù)
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 英雄哪里出來 閱讀(2502) 評論(0)  編輯 收藏 引用 所屬分類: 數(shù)學(xué)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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精品免费视频| 国产欧美日韩亚洲| 久久综合九色99| 欧美黄色小视频| 亚洲免费一级电影| 久久精品一级爱片| 亚洲毛片一区二区| 亚洲一区黄色| 亚洲国产精品福利| 9色国产精品| 国产一区二区三区精品欧美日韩一区二区三区| 久久久之久亚州精品露出| 老司机精品视频一区二区三区| 亚洲美女视频网| 亚洲欧美日韩一区二区三区在线| 一区二区在线不卡| 一本色道婷婷久久欧美| 国内外成人免费激情在线视频网站| 欧美韩国在线| 国产日韩精品入口| 亚洲电影免费观看高清完整版在线| 蘑菇福利视频一区播放| 校园激情久久| 欧美成人精品一区| 久久久www成人免费无遮挡大片| 蜜臀a∨国产成人精品| 午夜精品一区二区三区在线 | 亚洲一区黄色| 久久天堂精品| 欧美专区在线播放| 欧美人与性禽动交情品| 久久影院午夜论| 国产精品大片wwwwww| 欧美电影专区| 国产综合精品一区| 亚洲午夜小视频| 夜夜夜久久久| 欧美精品日韩www.p站| 欧美激情a∨在线视频播放| 欧美另类综合| 玖玖综合伊人| 国产揄拍国内精品对白| 一本久道综合久久精品| 日韩小视频在线观看专区| 久久爱www.| 久久成人国产| 国产精品视频免费在线观看| 亚洲三级免费观看| 亚洲精品护士| 欧美h视频在线| 欧美国产精品| 亚洲欧洲久久| 欧美风情在线观看| 亚洲国产精品传媒在线观看| 在线看欧美视频| 久久久综合网| 狂野欧美激情性xxxx欧美| 国产亚洲精品bv在线观看| 亚洲一区二区三区乱码aⅴ| 亚洲视频免费| 国产精品高清在线观看| 制服诱惑一区二区| 亚洲欧美日韩专区| 国产精品视频精品| 午夜精品久久久久久99热| 久久成人精品电影| 韩国一区电影| 欧美福利一区| 99这里只有精品| 欧美一区二区三区四区在线观看| 国产欧美日韩一级| 久久久久免费视频| 亚洲成人资源网| 亚洲视频在线观看三级| 国产精品亚洲综合天堂夜夜| 午夜视频在线观看一区二区三区 | 亚洲国产天堂网精品网站| 亚洲精品永久免费| 欧美视频一区| 欧美综合77777色婷婷| 久久综合中文字幕| 日韩图片一区| 国产日韩综合| 美女国产精品| 亚洲视频福利| 欧美xxx在线观看| aa日韩免费精品视频一| 国产精品自在线| 免费观看在线综合色| 亚洲最新视频在线| 久久综合九色欧美综合狠狠| 99re6热在线精品视频播放速度| 国产精品盗摄久久久| 久久久夜精品| 在线中文字幕一区| 欧美成人午夜激情| 欧美一级视频| 99国产精品| 亚洲第一网站免费视频| 国产精品成人播放| 免费在线欧美黄色| 欧美在线观看视频在线| 亚洲美女免费视频| 女女同性精品视频| 欧美亚洲综合久久| 国产欧美在线| 亚洲字幕一区二区| 欧美伊人影院| 亚洲私拍自拍| 亚洲欧洲一区二区三区久久| 国产精品老女人精品视频| 嫩草成人www欧美| 久久xxxx精品视频| 亚洲视频狠狠| 亚洲乱码久久| 亚洲高清激情| 女女同性精品视频| 久久网站免费| 欧美中文在线视频| 亚洲一区二区三区四区视频| 亚洲国产日韩欧美综合久久 | 欧美日韩一级视频| 欧美波霸影院| 男同欧美伦乱| 免费日韩av| 另类尿喷潮videofree| 欧美一区二区三区在线看| 亚洲一级二级| 国产精品99久久久久久人| 亚洲麻豆一区| 亚洲精品一区在线观看| 亚洲国产专区校园欧美| 亚洲电影免费观看高清完整版| 男人插女人欧美| 欧美大片在线看| 欧美黄色小视频| 亚洲第一精品夜夜躁人人躁| 欧美国产国产综合| 亚洲日本欧美在线| 亚洲乱码国产乱码精品精| 亚洲精品美女在线观看| 亚洲日本va午夜在线电影| 亚洲激情婷婷| 一本色道久久综合亚洲91| 亚洲天堂男人| 小辣椒精品导航| 久久精品一区中文字幕| 久久综合伊人77777蜜臀| 免费欧美在线视频| 欧美日韩另类综合| 国产精品亚洲аv天堂网| 国产偷自视频区视频一区二区| 激情成人中文字幕| 亚洲黄色av一区| 亚洲特黄一级片| 欧美一区永久视频免费观看| 久久免费视频网站| 亚洲国产成人久久综合一区| 日韩亚洲在线| 性欧美video另类hd性玩具| 久久久欧美精品| 欧美日韩不卡一区| 国产欧美日韩免费| 亚洲日韩欧美视频一区| 亚洲一区二区3| 久久精品中文字幕一区| 亚洲国产成人久久综合一区| 一区二区三区视频在线观看| 欧美自拍偷拍午夜视频| 欧美精品在线一区二区| 国产视频在线观看一区二区| 亚洲片区在线| 久久疯狂做爰流白浆xx| 亚洲国产合集| 欧美一区二区精品在线| 欧美激情国产精品| 国产婷婷色综合av蜜臀av| 亚洲伦理一区| 久热精品在线视频| 一区二区三区欧美激情| 久久在线免费观看| 国产精品伦一区| 亚洲精选在线| 麻豆av一区二区三区| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲国产精品成人久久综合一区| 亚洲毛片一区二区| 久久精品一区中文字幕| 国产精品久久久久久久7电影| 在线免费观看成人网| 欧美亚洲午夜视频在线观看| 亚洲精品国产无天堂网2021| 久久久国产精品一区| 国产精品日韩高清|