问题标题: 酷町堂:位数问题k

0
0
已解决
赵泰来
赵泰来
高级光能
高级光能

题目描述 Description

输入一个数n,请你计算在所有的n位数中,有多少数中含有k个数字3。由于数字可能很大,请你输出答案模上10007后的结果。

输入描述 Input Description

两个整数n、k

输出描述 Output Description

一个整数,如题所述

样例输入 Sample Input

3 2

样例输出 Sample Output

26

数据范围及提示 Data Size & Hint

0<k<n<=1000
样例说明:在所有的3位数中,出现两次3的数字有133、233、433、533、633、733、833、933、303、330、331、332、334、335、336、337、338、339、313、323、343、353、363、373、383、393

求思路,救救孩子吧


0
0
徐子宸
徐子宸
中级天翼
中级天翼

您老人家怕不是在考试吧(其实我也是)

0
汪宇航
汪宇航
新手启示者
新手启示者

for,学过了吗?

for外圈:

for(int i=pow(10,n)i<=pow(10,n+1)-1;i++){

    ...

    ...

    ...

}

cout<<cnt%10007;

0
汪恺恒
汪恺恒
中级启示者
中级启示者

递推啊

还有,这不是考试题吗(结果我爆20,因为0打成了1,样例竟没调出来)

状态:

f[i][j]表示i位数中有j个3的方案数

递推式

f[i][j]=(f[i-1][j]*9+f[i-1][j-1])%10007;

边界

f[1][0]=8,f[1][1]=1;

核心

for(int i=2;i<=n;i++){
        for(int j=0;j<=min(k,i);j++){//j一定是从0开始!
            f[i][j]=(f[i-1][j]*9+f[i-1][j-1])%10007;
        }
    }

 

0
汪宇航
汪宇航
新手启示者
新手启示者

@李显晨,内圈可以变成函数:

int f(...){

    if(f%...==0||...||f%...==0) return 1;

return 0;

}

for里面:

if(f(i)) cnt++;

 

0
0
我要回答