Tome módulo y DP digital en el intervalo de juegos digitales Campamento de vacaciones de invierno

Como los juegos digitales son muy populares en la Asociación para la Ciencia y la Tecnología recientemente, alguien nombró un número de módulo. Este tipo de número debe satisfacer que la suma de los números modN es 0. Ahora todos van a jugar el juego nuevamente. Especifique un intervalo cerrado entero [a, b] y pregunte cuántos módulos hay en este intervalo.

Formato de entrada La
pregunta tiene varios conjuntos de datos de prueba. Cada grupo contiene solo tres números a, by N.

Formato de
salida Muestra una línea para cada dato de prueba, indicando el número de cada dígito y el número con modN siendo 0.

Ejemplo de
entrada Salida
1 19 9
2
Rango de datos y recordatorio
Para todos los datos, 1≤a, b≤231−1,1≤N <100.
Tome el módulo, incluso si el estado restante cambia en la posición actual, escríbalo en la pizarra

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <map>
#include <stack>
#include <set>
#include <queue>
#include <vector>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
#define ls (p<<1)
#define rs (p<<1|1)
#define ll long long
using namespace std;
const int maxn = 2e6+5;
const int INF = 0x3f3f3f3f;
ll dp[30][110];//dp[pos][pre]记录了遍历第pos为位时,前一位为pre时的状态数
ll a[30],b[30];
int p;
// void init(){
    
    
//     dp[0][0]=1;
//     dp[0][1]=dp[0][2]=0;
//     for(int i=1;i<25;i++){
    
    
//         dp[i][0]=10*dp[i-1][0]-dp[i-1][1];//长度为i不含有49的个数
//         dp[i][1]=dp[i-1][0];//最高位为9但不含49的个数
//         dp[i][2]=10*dp[i-1][2]+dp[i-1][1];//含有49的个数
//     }
// }
int dfs(int pos,int pre,bool limit) {
    
    
	if(!pos){
    
    
        if(pre%p==0)
            return 1;
        else return 0;
    }	
	if(!limit&&dp[pos][pre]!=-1)	
        return dp[pos][pre];
    int up;
    if(limit)
        up=a[pos];
    else up=9;
    int ans=0;
	for(int i=0;i<=up;i++) {
    
    
		ans+=dfs(pos-1,pre+i%p,limit&&i==up);
	}
    if(!limit)
        dp[pos][pre]=ans;
	return ans;
}

int init(int n)
{
    
    
    int len=0;
    while(n){
    
    
        a[++len]=n%10;
        n/=10;
    }
    return dfs(len,0,1);
}

void solve(){
    
    
   int x,y;
   while(scanf("%d%d%d",&x,&y,&p)!=EOF){
    
    
       memset(dp,-1,sizeof(dp));
       cout<<init(y)-init(x-1)<<endl;
   }
}

int main()
{
    
    
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    solve();
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_45891413/article/details/112909745
Recomendado
Clasificación