码迷,mamicode.com
首页 > 其他好文 > 详细

P1066 2^k进制数

时间:2019-04-07 22:25:48      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:through   pow   with   data   string   text   using   ora   https   

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进制数

标签:through   pow   with   data   string   text   using   ora   https   

原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/10667106.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!