无名氏


私信TA

用户名:dotcpp0669591

访问量:1780

签 名:

成功的路上并不拥挤,因为坚持的人并不多

等  级
排  名 2783
经  验 2152
参赛次数 6
文章发表 13
年  龄 13
在职情况 学生
学  校 淮南龙湖中学
专  业

  自我简介:

我是阳光开朗大女孩,不太喜欢C语言,中学生

解题思路:方法1排列组合(但需要运用动态规

可以列出公式,在n个格子中放x个3(其中x为偶数,包括0

c(n,x)*9^(n-x)-c(n-1,x)*9^(n-x-1)含义为在n个格子中取x个3,且不考虑第一位的特殊情况为c(n,x)*9^(n-x),而第一位为0的情况为c(n-1,x)*9^(n-x-1),两者相减,就为答案。

              方法2:递推
考虑这种题目,一般来说都是从第一个i-1位推导第i位,且当前位是取偶数还是奇数的。

恍然大悟,可以用f[i][0]表示前i位取偶数个3用几种情况,f[i][1]表示前i位取奇数个3有几种情况。

则状态转移方程可以表示为:

f[i][0]=f[i-1][0]*9+f[i-1][1];   f[i][1]=f[i-1][0]+f[i-1][1]*9;

边界条件:f[1][1]=1;   f[1][0]=9;
注意事项:在所有的2位数字,包含0个3的数有72个,包含2个3的数有1个,共73个
参考代码:位数问题.png代码代码(可复制):

#include

using namespace std;

int main(){

int f[1001][2],n,i,x;

cin>>n;

f[1][1]=1;

f[1][0]=9;

for(i=2;i<=n;i++)

{

x=f[1][0];

if(i==n)x--;

f[i][0]=(f[i-1][0]*x+f[i-1][1])%12345;

f[i][i]=(f[i-1][1]*x+f[i-1][0])%12345;

}

cout<<f[n][0];

return 0;

第一篇题解,支持一下

(QuQ)

 

0.0分

2 人评分

  评论区

  • «
  • »