注意事项:求解的答案最大为200位的十进制,longlong不能存下,用数组存,数组中的每个变量都存十位十进制数,计算答案时是高精度加法;

参考代码:

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

int a[30000][512]={0};//a[i][j];i位数,j当前位数下最高位的数字;a[i][j]存的是最高位为j,位数为i,满足条件的数的个数

int main(){

    int k,w;

    ll ans[21]={0};//存答案;

    

    cin>>k>>w;

    int wl=w/k;//最大2^k制位数

    int ml1=pow(2,k);//每位数可取值限制

    int ml2;//位数最大时最高位的取值限制

    if(w%k!=0){

        wl++;

        ml2=min((int)pow(2,w%k),ml1);

    }

    for(int j=1;j<ml1;j++){//初始化,1位的每个取值个数都为1

        a[1][j]=1;

    }

    int kk=0;

    for(int i=2;i<=wl;i++){//从2位数的个数开始计算

        int ml=ml1;

        if(i==wl)ml=ml2;

        ll t=0;

        for(int j=1;j<ml;j++){//i位,最高位为j

            for(int k=j+1;k<ml1;k++){

                a[i][j]+=a[i-1][k];

            }

            t+=a[i][j];

        }

        ll u=0;

        //10000000000进制的高精度加法

        kk=0;

        ans[kk]+=t;

        while(ans[kk]/10000000000!=0){

            ans[kk+1]+=(ans[kk]/10000000000);

            ans[kk]=ans[kk]%10000000000;

            kk++;

        }

    }

    kk=20;

    while(ans[kk]==0){

        kk--;

    }

    while(kk>=0){

        cout<<ans[kk];

        kk--;

    }

    cout<<endl;

    return 0;

}




点赞(0)
 

0.0分

2 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论