P1066 2^k进制数

Posted xiaoyezi-wink

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1066 2^k进制数相关的知识,希望对你有一定的参考价值。

P1066 2^k进制数

这个题目还是没有听明白。。。借鉴一下某位不愿透露的邱姓dalao的blog。。。

 结合一下题解

 

普及一下知识:一个2^k进制n位数转换成2进制数时最多有n*k位

 

试图理解

 

。。。。。。。。。。。。。。。。

 

。。。。真的太南啦不然你就结合一下blog。。。。认错

 

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[4][512][201],tot[201],mmax;
int pow(int a,int b)
{
    int ans=1,with=a;
    while(b)
    {
        if(b&1) ans*=with;
        with*=with;
        b>>=1;
    }
    return ans;
}
void jiafa(int j[],int a[])
{
    int lb=1;
    while(lb<=j[0]||lb<=a[0])
    {
        j[lb]+=a[lb];
        if(j[lb]>=10) 
        {
            j[lb]%=10;
            j[lb+1]++;
        }
        lb++;
    }
    while(j[lb]>=10) 
    {
        j[lb]%=10;
        lb++;
        j[lb]++;
    }
    while(!j[lb]&&lb>0) lb--;
    if(lb>j[0]) j[0]=lb;
}
void jiafa1(int a[],int b)
{
    int lb=0;
    while(b)
    {
        a[++lb]=b%10;
        b/=10;
    }
    a[0]=lb;
    jiafa(tot,a);
}
int main()
{
    int k,w;
    cin>>k>>w;
    int g=w/k;
    bool youyu=0;
    int mmax2;
    if(w%k)
    {
        g++;
        youyu=1;
        mmax2=pow(2,w%k)-1;
    } 
    mmax=pow(2,k)-1;
    for(int i=1;i<mmax;i++) jiafa1(a[0][i],mmax-i);
    int l=0,n=1;
    for(int i=3;i<=g;i++)
    {
        if(i==g&&youyu&&mmax2<mmax)
        {
            for(int i=mmax-1;i>mmax2;i--)
                jiafa(a[n][mmax2],a[l][i]);
            jiafa(tot,a[n][mmax2]);
            for(int j=mmax2-1;j>=1;j--)
            {
                memcpy(a[n][j],a[n][j+1],sizeof(a[n][j+1]));
                jiafa(a[n][j],a[l][j+1]);
                jiafa(tot,a[n][j]);
            }
            break;
        } 
        jiafa(a[n][mmax-1],a[l][mmax]);
        jiafa(tot,a[n][mmax-1]);
        for(int j=mmax-2;j>=1;j--)
        {
            memcpy(a[n][j],a[n][j+1],sizeof(a[n][j+1]));
            jiafa(a[n][j],a[l][j+1]);
            jiafa(tot,a[n][j]);
        }
        for(int j=1;j<=mmax;j++)
        memset(a[l][j],0,sizeof(a[l][j]));
        n++;l++;
        if(n==3) n=0;
        if(l==3) l=0;
    }
    int lt=tot[0];
    while(!tot[lt]&&lt>1) lt--;
    for(;lt>0;lt--) cout<<tot[lt];
    return 0;
}

 

以上是关于P1066 2^k进制数的主要内容,如果未能解决你的问题,请参考以下文章

P1066 2^k进制数

[luogu]P1066 2^k进制数[数学][递推][高精度]

[NOIP2006] 提高组 洛谷P1066 2^k进制数

求2^k进制数C++语言,带解释。。。。。。。

问题 1110: 2^k进制数

K-进制数