• Codeforces Round #157 (Div. 2) D. Little Elephant and Elections(数位DP+枚举)


    数位DP部分,不是很难。DP[i][j]前i位j个幸运数的个数。枚举写的有点搓。。。

      1 #include <cstdio>
      2 #include <cstring>
      3 using namespace std;
      4 #define LL __int64
      5 #define MOD 1000000007
      6 int dp[21][21];
      7 int p[21],num;
      8 int o[21];
      9 int dfs(int pos,int pre,int bound)
     10 {
     11     int ans,i,end;
     12     ans = 0;
     13     if(pos == -1)
     14     return pre == 0;
     15     if(!bound&&dp[pos][pre] != -1)
     16     return dp[pos][pre];
     17     end = bound ? p[pos]:9;
     18     for(i = 0;i <= end;i ++)
     19     {
     20         if(i == 4||i == 7)
     21         ans += dfs(pos-1,pre-1,bound&&i == end);
     22         else
     23         ans += dfs(pos-1,pre,bound&&i == end);
     24     }
     25     if(!bound)
     26     dp[pos][pre] = ans;
     27     return ans;
     28 }
     29 void CL(int m)
     30 {
     31     num = 0;
     32     while(m)
     33     {
     34         p[num++] = m%10;
     35         m /= 10;
     36     }
     37 }
     38 int main()
     39 {
     40     int i,m;
     41     int a1,a2,a3,a4,a5,a6,sum;
     42     LL ta1,ta2,ta3,ta4,ta5,ta6;
     43     LL ans,t1,t2;
     44     memset(dp,-1,sizeof(dp));
     45     scanf("%d",&m);
     46     CL(m);
     47     for(i = 0;i <= 9;i ++)
     48     {
     49         o[i] = dfs(num-1,i,1);
     50     }
     51     o[0] --;
     52     ans = 0;
     53     for(a1 = 0;a1 <= 9;a1 ++)
     54     {
     55         ta1 = o[a1];
     56         o[a1] -- ;
     57         for(a2 = 0;a2 <= 9&&o[a1] >= 0;a2 ++)
     58         {
     59             ta2 = o[a2];
     60             o[a2] -- ;
     61             for(a3 = 0;a3 <= 9&&o[a2] >= 0;a3 ++)
     62             {
     63                 ta3 = o[a3];
     64                 o[a3] -- ;
     65                 for(a4 = 0;a4 <= 9&&o[a3] >= 0;a4 ++)
     66                 {
     67                     ta4 = o[a4];
     68                     o[a4] -- ;
     69                     for(a5 = 0;a5 <= 9&&o[a4] >= 0;a5 ++)
     70                     {
     71                         ta5 = o[a5];
     72                         o[a5] -- ;
     73                         for(a6 = 0;a6 <= 9&&o[a5] >= 0;a6 ++)
     74                         {
     75                             ta6 = o[a6];
     76                             o[a6] -- ;
     77                             sum = a1 + a2 + a3 + a4 + a5 + a6;
     78                             if(sum <= 9&&o[a6] >= 0)
     79                             {
     80                                 t1 = ta1;
     81                                 t1 = t1*ta2%MOD;
     82                                 t1 = t1*ta3%MOD;
     83                                 t1 = t1*ta4%MOD;
     84                                 t1 = t1*ta5%MOD;
     85                                 t1 = t1*ta6%MOD;
     86                                 t2 = 0;
     87                                 for(i = sum+1;i <= 9;i ++)
     88                                 t2 += o[i];
     89                                 ans = (ans + t1*t2)%MOD;
     90                             }
     91                             o[a6] ++ ;
     92                         }
     93                         o[a5] ++ ;
     94                     }
     95                     o[a4] ++ ;
     96                 }
     97                 o[a3] ++ ;
     98             }
     99             o[a2] ++;
    100         }
    101         o[a1] ++ ;
    102     }
    103     printf("%I64d
    ",ans);
    104     return 0;
    105 }
  • 相关阅读:
    使用Jpath 对Json字符串进行解析
    使用PowerDesigner 生成mysql 数据库脚本
    在windows 环境下Kratos 代码示例搭建
    Java jdbc无法连接sql server和sa登录失败的坑
    win10 安装sql server 2008 提示重新启动计算机失败
    RNN计算loss function
    ReLU 函数非线性
    TopK 问题
    mysql初始化问题(版本 8.0.11)
    投资理财的66条军规
  • 原文地址:https://www.cnblogs.com/naix-x/p/3392968.html
Copyright © 2020-2023  润新知