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]&<>1) lt--; for(;lt>0;lt--) cout<<tot[lt]; return 0; }
以上是关于P1066 2^k进制数的主要内容,如果未能解决你的问题,请参考以下文章