codevs 1157 2k進位數

來源:互聯網
上載者:User

標籤:

1157 2k進位數 

2006年NOIP全國聯賽提高組

 時間限制: 1 s 空間限制: 128000 KB 題目等級 : 黃金 Gold 題目描述 Description

設r是個2k進位數,並滿足以下條件:

(1)r至少是個2位的2k進位數。

(2)作為2k進位數,除最後一位外,r的每一位嚴格小於它右邊相鄰的那一位。

(3)將r轉換為2進位數q後,則q的總位元不超過w。

在這裡,正整數k(1≤k≤9)和w(k<W< span>≤30000)是事先給定的。

問:滿足上述條件的不同的r共有多少個?

我們再從另一角度作些解釋:設S是長度為w 的01字串(即字串S由w個“0”或“1”組成),S對應於上述條件(3)中的q。將S從右起劃分為若干個長度為k 的段,每段對應一位2k進位的數,如果S至少可分成2段,則S所對應的位元又可以轉換為上述的2k進位數r。

例:設k=3,w=7。則r是個八位元(23=8)。由於w=7,長度為7的01字串按3位一段分,可分為3段(即1,3,3,左邊第一段只有一個二進位位),則滿足條件的八位元有:

2位元:高位為1:6個(即12,13,14,15,16,17),高位為2:5個,…,高位為6:1個(即67)。共6+5+…+1=21個。

3位元:高位只能是1,第2位為2:5個(即123,124,125,126,127),第2位為3:4個,…,第2位為6:1個(即167)。共5+4+…+1=15個。

所以,滿足要求的r共有36個。

輸入描述 Input Description

只有1行,為兩個正整數,用一個空格隔開:

k W

輸出描述 Output Description

共1行,是一個正整數,為所求的計算結果,即滿足條件的不同的r的個數(用十進位數表示),要求最高位不得為0,各數字之間不得插入數字以外的其他字元(例如空格、分行符號、逗號等)。

(提示:作為結果的正整數可能很大,但不會超過200位)

範例輸入 Sample Input

3 7

範例輸出 Sample Output

36

資料範圍及提示 Data Size & Hint

 

/*F[i][j]表示以i開頭的長度為j的有幾個F[i][j]=f[i+1][j-1]+f[i+2][j-1]+...+f[maxx][j-1]但這樣做會逾時觀察到:f[i+1][j]=f[i+2][j-1]+...+f[maxx][j-1]F[i][j]=f[i+1][j-1]+f[i+1][j]*/
/*90分逾時代碼*/#include<iostream>#include<cstdio>#include<cstring>#define LL unsigned long long#define maxn 30010using namespace std;int p,w,r,l,len=1;int a[maxn],f[15];struct node{    int l,a[210]; }g[520][610],ans;void add(node &x,node &y){    int l1=x.l,l2=y.l,l3=1,i,j,k;    LL c[210]={0};    while(l3<=l1||l3<=l2)    {        c[l3]+=(x.a[l3]+y.a[l3]);        c[l3+1]+=c[l3]/1000000000;        c[l3]%=1000000000;        l3++;    }    while(l3>1&&c[l3]==0)l3--;    x.l=l3;    for(i=1;i<=l3;i++)    x.a[i]=c[i];}void prepare(){    LL i,j,k;    f[0]=1;    for(LL i=1;i<=9;i++)    f[i]=f[i-1]<<1;    for(i=1;i<f[p];i++)    {        int q=f[p]-i-1;        while(q>0)        {            g[i][2].l++;            g[i][2].a[g[i][2].l]=q%1000000000;            q=q/1000000000;        }    }    for(j=3;j<=l+1;j++)      for(i=1;i<f[p];i++)        for(k=i+1;k<f[p];k++)        add(g[i][j],g[k][j-1]);}int main(){    LL i,j,k;    scanf("%d%d",&p,&w);    r=w%p;    l=w/p;    prepare();    for(i=1;i<=l;i++)    a[i]=f[p];    a[l+1]=f[r];    for(j=2;j<=l+1;j++)      for(i=1;i<a[j];i++)        add(ans,g[i][j]);    printf("%d",ans.a[ans.l]);    for(i=ans.l-1;i>=1;i--)    printf("%09d",ans.a[i]);    cout<<endl;    return 0;}

 
/*AC代碼*/
#include<iostream>#include<cstdio>#include<cstring>#define LL unsigned long long#define maxn 30010using namespace std;int p,w,r,l,len=1;int a[maxn],f[15];struct node{ int l,a[210]; }g[520][610],ans;void add(node &x,node &y){ int l1=x.l,l2=y.l,l3=1,i,j,k; LL c[210]={0}; while(l3<=l1||l3<=l2) { c[l3]+=(x.a[l3]+y.a[l3]); c[l3+1]+=c[l3]/1000000000; c[l3]%=1000000000; l3++; } while(l3>1&&c[l3]==0)l3--; x.l=l3; for(i=1;i<=l3;i++) x.a[i]=c[i];}void prepare(){ LL i,j,k; f[0]=1; for(LL i=1;i<=9;i++) f[i]=f[i-1]<<1; for(i=1;i<f[p];i++) { int q=f[p]-i-1; while(q>0) { g[i][2].l++; g[i][2].a[g[i][2].l]=q%1000000000; q=q/1000000000; } } for(j=3;j<=l+1;j++) for(i=f[p]-1;i>=1;i--) { add(g[i][j],g[i+1][j]); add(g[i][j],g[i+1][j-1]); }}int main(){ LL i,j,k; scanf("%d%d",&p,&w); r=w%p; l=w/p; prepare(); for(i=1;i<=l;i++) a[i]=f[p]; a[l+1]=f[r]; for(j=2;j<=l+1;j++) for(i=1;i<a[j];i++) add(ans,g[i][j]); printf("%d",ans.a[ans.l]); for(i=ans.l-1;i>=1;i--) printf("%09d",ans.a[i]); cout<<endl; return 0;}

 

 

codevs 1157 2k進位數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.