Número equilibrado HDU-3709 Finding Moment Digital DP Winter Camp Training

Un número balanceado es un número entero no negativo que se puede balancear si se coloca un pivote en algún dígito. Más específicamente, imagine cada dígito como un cuadro con el peso indicado por el dígito. Cuando se coloca un pivote en algún dígito del número, la distancia de un dígito al pivote es el desplazamiento entre este y el pivote. Entonces se pueden calcular los pares de torsión de la parte izquierda y la parte derecha. Está equilibrado si son iguales. Un número balanceado debe estar balanceado con el pivote en algunos de sus dígitos. Por ejemplo, 4139 es un número balanceado con pivote fijo en 3. Los pares son 4 2 + 1 1 = 9 y 9 * 1 = 9, para la parte izquierda y la parte derecha, respectivamente. Es su trabajo
calcular el número de números balanceados en un rango dado [x, y].
Entrada
La entrada contiene varios casos de prueba. La primera línea es el número total de casos T (0 <T ≤ 30). Para cada caso, hay dos números enteros separados por un espacio en una línea, xey. (0 ≤ x ≤ y ≤ 1018).
Salida
Para cada caso, imprima el número de números balanceados en el rango [x, y] en una línea.
Ejemplo de entrada
2
0 9
7.604 24 324
Salida de muestra
10
897

#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][82][2010];
ll a[30];
ll dfs(int pos,int pre,int mo,bool limt){
    
    //pre支点,力矩为mo
    if(pos==0){
    
    
        if(mo==0) return 1;
        else return 0;
    } 
    if(mo<0) return 0;
    if(!limt&&dp[pos][pre][mo]!=-1)
        return dp[pos][pre][mo];
    ll up;
    if(limt){
    
    
        up=a[pos];
    }
    else up=9;
    ll ans=0;
    for(int i=0;i<=up;i++){
    
    
        int tmp=mo+i*(pos-pre);
        ans+=dfs(pos-1,pre,tmp,limt&&i==a[pos]);
    }
    if(!limt)
        dp[pos][pre][mo]=ans;
    return ans;
    
}
ll init(ll x){
    
    
    if(x<0) return 0;
    int len=0;
    while(x){
    
    
        a[++len]=x%10;
        x/=10;
    }
    ll ans=0;
    for(int i=1;i<=len;i++){
    
    
        ans+=dfs(len,i,0,1);
    }
    return ans-len+1;
}
void solve(){
    
    
    int t;
    cin>>t;
    memset(dp,-1,sizeof(dp));
    memset(a,0,sizeof(a));
    int cas=0;
    while(t--){
    
    
        ll n,m;
        cin>>n>>m;
        cout<<init(m)-init(n-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/113001042
Recomendado
Clasificación