解题思路:

思路: 动态规划  与 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;
}


点赞(5)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论