Lien: https://ac.nowcoder.com/acm/contest/5086/E
Source: Niuke.com
restrictions de l' espace: C / C ++ 262144K, d' autres langues 524288K
64bit IO Format: LLD%
Description du titre
Par exemple, 47, 744 et 4 sont des numéros porte-bonheur et 5, 17 et 467 ne le sont pas.
Définissez next (x) comme le premier chiffre porte-bonheur supérieur ou égal à x. Étant donné l, r, demander suivant (l) + suivant (l + 1) + ... + suivant (r-1) + suivant (r).
Entrez la description:
Deux entiers l et r (1 <= l <= r <= 1 000 000 000).
Description de la sortie:
Un nombre indique la réponse.
Entrée
2 7
Sortie
33
Entrée
7 7
Sortie
7
En écrire un:
De toute évidence, la valeur suivante dans une plage est la même.
Nous pouvons mettre les valeurs suivantes possibles dans l'ordre croissant dans un conteneur vectoriel grâce au prétraitement. Selon la plage de données 1e9, faites également attention à y insérer 4444444444.
Nous utilisons lower_bound () pour trouver la première position dans le conteneur qui est supérieure ou égale à l. Ensuite, vous pouvez transmettre la relation entre le numéro porte-bonheur et la valeur r tout en étant ok.
1 #include <bits / stdc ++. H> 2 typedef long long LL; 3 #define pb push_back 4 const int INF = 0x3f3f3f3f ; 5 const double eps = 1e- 8 ; 6 const int mod = 1e9 + 7 ; 7 const int maxn = 1e5 + 10 ; 8 utilisant l' espace de noms std; 9 10 vecteur <LL> vt; 11 12 void init () 13 { 14 pour ( int i = 1 ; i <= 9 ; i ++) // recherche tous les nombres porte-bonheur avec un total de i chiffres 15 { 16 pour ( int s = 0 ; s <( 1 << i); s ++) // Construire un nombre binaire s, le bit correspondant 1 représente le nombre 7, 0 représente le nombre 4 17 { 18 LL t = 0 ; 19 pour ( int j = i- 1 ; j> = 0 ; j--) // parcourir chaque bit Lorsque vous faites attention, vous devez revenir en arrière 20 { 21 si (( 1 << j) & s) t = t *10 + 7 ; // Le bit correspondant est 1, la fin de t +7 22 sinon t = t * 10 + 4 ; // Le bit correspondant est 0, la fin de t +4 23 } 24 vt.pb (t); 25 } 26 } 27 vt.pb ( 4444444444 ); // Selon la plage de données, les dix chiffres ne doivent être pris en compte, donc push_back 28 } 29 30 int main () 31 { 32 #ifdef DEBUG 33 freopen ( " sample.txt " , " r" , stdin); // freopen (" data.out "," w ", stdout); 34 #endif 35 36 init (); 37 int l, r; 38 scanf ( " % d% d " , & l, & r); 39 int pos = lower_bound (vt.begin (), vt.end (), l) -vt.begin (); 40 LL ans = 0 ; 41 LL pre = l; // Le dernier chiffre porte-bonheur peut résoudre À quel nombre 42 while (vt [pos] <= r) 43 { 44 ans + = (vt [pos] -pre + 1 ) * vt [pos]; //Ajouter la valeur suivante entre pré et le numéro porte-bonheur à ce moment 45 pre = vt [pos] + 1 ; // Mettre à jour la pré-valeur au numéro porte-bonheur actuel + 1 46 pos ++; // Prochain numéro porte-bonheur 47 } 48 ans + = ( r-pre + 1 ) * vt [pos]; // Ajouter le premier chiffre porte-bonheur plus petit que r à la valeur suivante entre r 49 printf ( " % lld \ n " , ans); 50 51 return 0 ; 52 }
En écrivant deux:
Puisqu'il n'y a que deux options pour chaque personne, il suffit de prétraiter directement via DFS .
1 #include <bits / stdc ++. H> 2 typedef long long LL; 3 #define pb push_back 4 const int INF = 0x3f3f3f3f ; 5 const double eps = 1e- 8 ; 6 const int mod = 1e9 + 7 ; 7 const int maxn = 1e5 + 10 ; 8 utilisant l' espace de noms std; 9 10 LL a [maxn]; 11 LL ans, l, r, cnt; 12 13 nulDFS (LL x) 14 { 15 si (x> r * 10 + 4 ) retourne ; 16 if (x) a [++ cnt] = x; 17 DFS (x * 10 + 4 ); 18 DFS (x * 10 + 7 ); 19 } 20 21 int main () 22 { 23 #ifdef DEBUG 24 freopen ( " sample.txt " , " r " , stdin); //freopen ("data.out", "w", stdout); 25 #endif 26 27 scanf ( " % lld% lld " , & l, & r); 28 DFS ( 0 ); 29 sort (a + 1 , a + 1 + cnt); 30 int pos = lower_bound (a + 1 , a + 1 + cnt, l) -a; 31 LL ans = 0 ; 32 LL pre = l; // Quel nombre peut être résolu par le dernier chiffre porte-bonheur 33 while (a ( pos] <= r) 34 { 35 ans + = (a [pos] -pre + 1 ) * a [pos]; // Ajouter la valeur suivante entre pre et le chiffre porte-bonheur à ce moment 36 pre = a [pos] + 1 ; // Mettre à jour la pré-valeur à la valeur courante Numéro porte-bonheur +1 37 pos ++; // Numéro porte-bonheur suivant 38 } 39 ans + = (r-pre + 1 ) * a [pos]; // Ajoutez le premier numéro porte-bonheur plus petit que r à la valeur suivante 40 entre r printf ( " % lld \ n " , ans); 41 42 return 0 ; 43 }
-