2^k进制数

xiaoxiao2025-06-11  29

题目

https://www.luogu.org/problemnew/show/P1066

思路

递推+高精度

f[i][j]表示共i位且最高位是j的方案数,显然有只要上一位比它大就可以转移,所以有f[i][j]=f[i-1][j+1]+…+f[i-1][2^k-i+1]

也就是f[i][j]=f[i][j+1]+f[i-1][j]

最后特判一下最后一段剩下的w<=k的就可以。

注意高精

代码

#include <bits/stdc++.h> using namespace std; typedef long long ll; int k,w,maxk; int a[515][515][205],res[205]; void mysum(int* x,int* y,int* z) { int jw=0,cur=0; z[0]=max(x[0],y[0]); for(int i=1;i<=z[0];i++) { int t=x[i]+y[i]+jw; cur=t%10;jw=t/10; z[i]=cur; } if(jw) { z[0]++; z[z[0]]=jw; } } int main() { scanf("%d%d",&k,&w); int maxk=pow(2,k); for(int i=1;i<=maxk;i++) for(int j=1;j<=i;j++) { if(j==1 || j==i) a[i][j][0]=1,a[i][j][1]=1; else mysum(a[i-1][j],a[i-1][j-1],a[i][j]); } int p=w/k,q=w-p*k; int maxq=pow(2,q); for(int i=2;i<=p&&i<maxk;i++) mysum(a[maxk][i+1],res,res); for(int i=1;i<=maxq-1&&p+i<maxk;i++) mysum(a[maxk-i][p+1],res,res); for(int i=res[0];i>=1;i--) printf("%d",res[i]); return 0; }
转载请注明原文地址: https://www.6miu.com/read-5031659.html

最新回复(0)