zoukankan      html  css  js  c++  java
  • [数位dp] Jzoj P5831 number

    Description

    给定正整数 n,m,问有多少个正整数满足: (1)不含前导 0; (2)是 m 的倍数; (3)可以通过重排列各个数位得到 n。
     

    Input

    一行两个整数 n,m。

    Output

    一行一个整数表示答案对 998244353 取模的结果。
     

    Sample Input

    1 1

    Sample Output

    1
     

    Data Constraint

    对于 20%的数据,n<10^10。
    对于 50%的数据,n<10^16,m<=20。
    对于 100%的数据,n<10^20,m<=100。

    题解

    • 设f[i][j]为当前选的数的状态为i 选的数%m为j 的方案数
    • 这个状态有点不一样,如果像平时二进制状态的话,就是2^30,再乘上后面的100,显然爆炸
    • 考虑一下可以避免无用状态,考虑用i*个数来表示状态
    • 这样的话,如果要找 j 的数量,可以用状态i/mi[j]%num[j]就可以得知
    • 那么考虑dp转移,(f[i+mi[j]][(z*10+j)%m]+=f[i][z]+mo)%=mo;
    • i是枚举的状态,j是当前加入的数字,z是之前剩下模m的余数

    代码

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 using namespace std;
     5 const int mo=998244353;
     6 int m,num[10];
     7 long long f[60010][101],mi[11],k[11],w[11];
     8 char s[21];
     9 void change(int x) { for (int i=9;i>=0;i--) w[i]=num[i]-(x/mi[i]),x%=mi[i]; }
    10 int main()
    11 {
    12 //    freopen("number.in","r",stdin);
    13 //    freopen("number.out","w",stdout);
    14     scanf("%s%d",s+1,&m);
    15     int len=strlen(s+1);
    16     for (int i=1;i<=len;i++) num[s[i]-'0']++;
    17     mi[0]=1; k[0]=mi[0]*num[0];
    18     for (int i=1;i<=9;i++) mi[i]=k[i-1]+1,k[i]=k[i-1]+mi[i]*num[i];
    19     for (int i=1;i<=9;i++) if (num[i]>0) f[mi[i]][i%m]=1;
    20     for (int i=1;i<=k[9];i++)
    21     {
    22         change(i);
    23         for (int j=0;j<=9;j++)
    24             if (w[j]>0)
    25                 for (int z=0;z<=m-1;z++)
    26                     (f[i+mi[j]][(z*10+j)%m]+=f[i][z]+mo)%=mo;
    27     }
    28     printf("%d",f[k[9]][0]);
    29     return 0;
    30 }
  • 相关阅读:
    [LUOGU]P1443 马的遍历
    NOIP 2017 D2T1 奶酪
    [0] Hello World
    网络测速 风行天下
    zabbix自动发现与监控内存和CPU使用率最高的进程,监测路由器 风行天下
    网络性能测试工具iperf 风行天下
    Centos7下杀毒软件clamav的安装和使用 风行天下
    LINUX漏洞安全防护防火墙相关 风行天下
    smokeping配置方法 风行天下
    vb+MAPX 数据绑定
  • 原文地址:https://www.cnblogs.com/Comfortable/p/9498390.html
Copyright © 2011-2022 走看看