原题链接:2^k进制数
解题思路:
思路: 动态规划 与 K好数 差不多 再加上 对 大数相加 的办法 因为数字极大
//按题目要求 就是 r限定在2进制位
注意事项:
参考代码:
#include<stdio.h> #include<string.h> int main() { long int k,w,i,j,m,t=0,le,lemax=0,add;unsigned long long int dp[3000][10];//dp[i][j] 代表以第i位位高位是j时的可行方案 unsigned long long int sum=0;int ans[202];//储存答案 memset(dp,0,sizeof(dp)); scanf("%ld%ld",&k,&w); t=w%k;// 获取特殊位 数值 w=w/k;//确定 可以按2^k 进制数完整的分组 有几组 即 除了最高位余下还有几位 2^3 7 2进制中 //7分成 1 3 3 有两组完整 k=(1<<k)-1;//确定进制数 k 为最大该进制数 8进制 最大进制数为 7; t=(1<<t)-1;// 特殊组 的可取范围 7 分 1 3 3 特殊的是 1为2进制 最高位只能 取 1 如果是 2^3 8 的 // 话分 2 3 3 特殊 2的2进制位 则最高为可为 1 2 3 非特殊高位为 则可为 1 2 3 4 5 6 7 for(i=1;i<=k;i++)//初始化 dp[w+1][i]=1;//以1~k 位最低位可取记 1 为 基础值 for(i=w;i>1;i--)//从 低位向高位处理 for(j=k-(w+1-i);j>=1;j--) //高位为 j { for(m=j;m<k;m++)// 相邻位可行 数 dp[i][j]+=dp[i+1][m+1]; sum+=dp[i][j]; if(sum>10000000) { le=0;add=0; while(sum)//大数 数据处理 { ans[le++]+=sum%10+add; add=ans[le-1]/10; sum/=10; if(lemax<le)lemax=le; } } } for(j=1;j<=t;j++)//特殊位处理 { for(m=j;m<k;m++) dp[1][j]+=dp[2][m+1]; sum+=dp[1][j]; if(sum>10000000)//大数 数据处理 { le=0;add=0; while(sum) { ans[le++]+=sum%10+add; add=ans[le-1]/10; sum/=10; if(lemax<le)lemax=le; } } } le=0;add=0; while(sum) { ans[le++]+=sum%10+add; add=ans[le-1]/10; sum/=10; if(lemax<le)lemax=le; } for(i=lemax-1;i>=0;i--) printf("%d",ans[i]); return 0; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复