• Nescafé2 月之谜 题解


    月之谜 (mystery.pas/c/cpp)

    【题目描述】

    打败了 Lord lsp 之后,由于 lqr 是一个心地善良的女孩子,她想净化 Lord lsp 黑化的心,使他变回到原来那个天然呆的 lsp……

    在光之英雄 applepi 的指引下,lqr 来到了月之泉。月之泉的精灵告诉她,想要净化 Lord lsp 的话,就要解出月之泉的谜题。

    具体地来说是这样的,定义月之数为能够被其十进制表示下各个数位的和整除的数。

    给定整数 L,R,你需要计算出区间[L, R]中有多少个月之数。

    lqr 发觉这不是数学竞赛能够解决的问题,于是她又找到了你……所以说你需要帮助她解决这个问题。

    【输入格式】

    输入文件包含多个测试数据。

    每组测试数据占一行,含有两个整数 L 和 R。

    输入文件以 EOF 结束。

    【输出格式】

    对于每组测试数据,在单独的一行内输出结果。

    【样例输入】

    1 100

    101 200

    【样例输出】

    33

    26

    【数据范围与约定】

    对于 20% 的数据,1≤L,R≤1000。

    对于 100% 的数据,1≤L,R≤2 31 -1。

    每个输入文件的测试数据不超过 3000 组。

    ——————————————我是分割线————————————————————

    好题,数位统计DP
    这就是著名的数位统计DP,首先把问题转化为calc(1,R)-calc(1,L-1)
    一般解题思路是:先DP预处理、再从高到低按位填数
    一旦填了一个比上限小的数位,就可以立即通过DP预处理出的值累加答案

    f[模][剩余数字数目][剩余数字的和][剩余位的模]=合法方案数
    f[S][i][j][k]=∑(f[S][i-1][j-R][(k-pwr[i-1]*R)%S], 0≤R≤9)
    边界条件:F[S][0][0][0]=1
    【代码】

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<queue>
     7 #include<cstdlib>
     8 #include<iomanip>
     9 #include<cassert>
    10 #include<climits>
    11 #define maxn 1000001
    12 #define F(i,j,k) for(int i=j;i<=k;i++)
    13 #define M(a,b) memset(a,b,sizeof(a))
    14 #define FF(i,j,k) for(int i=j;i>=k;i--)
    15 #define inf 0x7fffffff
    16 using namespace std;
    17 int read(){
    18     int x=0,f=1;char ch=getchar();
    19     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    20     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    21     return x*f;
    22 }
    23 int n,m;
    24 int f[82][10][82][82],pwr[82][10];;
    25 int sum,L,R;
    26 int num[10];
    27 inline int modabs (int a, int mod) 
    28 { 
    29     return ((a % mod)+mod)%mod;
    30 }
    31 int run(int p,int sum,int mod,int s,bool e)
    32 {
    33     int a,b;
    34     if(s-sum<0) return 0;
    35     else if(!e) return f[s][p+1][s-sum][(s-mod)%s];
    36     else if(p==-1)
    37     {
    38         if(sum==s&&mod==0) return 1;
    39         else return 0;
    40     }
    41     else
    42     {
    43         int res=0;
    44     F(d,0,num[p])
    45     {
    46         res+=run(p-1,sum+d,(mod+pwr[s][p]*d)%s,s,d==num[p]);
    47     }
    48     return res;
    49     }
    50 }
    51 int fcount(int t)
    52 {
    53     int a,b;
    54     if(t==0) return 0;
    55     int maxx=0;
    56     while(t){
    57         num[maxx++]=t%10;
    58         t/=10;
    59     }
    60     int res=0;
    61     F(i,1,81) res+=run(maxx-1,0,0,i,true);
    62     return res;
    63 }
    64 int main()
    65 {
    66     std::ios::sync_with_stdio(false);//cout<<setiosflags(ios::fixed)<<setprecision(1)<<y;
    67     #ifdef LOCAL
    68     freopen("data.in","r",stdin);
    69     freopen("data.out","w",stdout);
    70     #endif
    71     F(s,1,81)
    72     {
    73         M(f[s],0);
    74         f[s][0][0][0]=1;
    75         pwr[s][0]=1%s;
    76         F(i,1,9) pwr[s][i]=(pwr[s][i-1]*10)%s;
    77         F(i,1,9)F(j,0,i*9)F(k,0,s)for(int d=0;d<=9&&j-d>=0;d++)
    78         {
    79             f[s][i][j][k]+=f[s][i-1][j-d][modabs(k-pwr[s][i-1]*d,s)];
    80         }
    81     }
    82     while(cin>>L>>R)
    83     {
    84         cout<<fcount(R)-fcount(L-1)<<endl;
    85     }
    86     return 0;
    87 }
    Nescafé2 月之谜
  • 相关阅读:
    unity ab包打包和加载的简单学习示例
    项目整理回顾1,关于单例使用
    关于lua闭包导致引用无法释放内存泄露
    unity lua require dofile loadfile 区别
    unity editor模式下读取文件夹资源
    unity texture 占用内存大小对比
    关于unity贴图压缩
    内聚,耦合,解耦和,依赖倒置
    lua type 获取 类型
    Unity+NGUI多分辨率适配方案
  • 原文地址:https://www.cnblogs.com/SBSOI/p/5642546.html
Copyright © 2020-2023  润新知