https://vjudge.net/problem/UVA-1640
タイトル
二つの数字$ $、$ B $に行番号との間に書かれた$ [a、b]は$番号を尋ねる0,1,2,3,4,5,6,7,8,9各発生を何回。$ N \ leqslant 10 ^ 8 $、データの500セット
問題の解決策
2つのケースは、すべてのを検討する......
数が203であれば、例えば、1は何回検討して表示されます。
その後、状況は$ 20、ビットを考える\ {1} \ SIM \ファントム{00}箱入り\箱入り{1} $、$ 20-0 + 1 $回
それは$ 1 \箱入り{1} 9 \シム\ファントム{0} \箱入り{1} 0 $、$ 19-0 + 1 $回現れるところ、10を考えてみましょう
その後、状況はその$ \箱入り{1} 99 \ simの\箱入り{1} 00 $、$ 99から0 + 1 $回発生し、百考えてみましょう
他の例は、= =これは単なる一例です......考慮する必要があります
ACコード
#include <cstdioを> する#include <cstdlib> の#include <cmath> の#include <CStringの> する#include <cassert> の#include <アルゴリズム> の#define REP(I、B)のための(レジスタINT I =(); I <(B)、I ++) の#define REPE(I、B)(登録INT I =(用); I <=(B); I ++) の#defineペール(I、B)のための(レジスタint型私は、()=; I> =(B); i--) の#ifdef sahdsg の#define DBG(...)のprintf(__ VA_ARGS__) の#else の#define DBG(...)(無効)0 #endifの # LNログを定義する 名前空間stdを使用。 長い長いLLのtypedef。 int型のA、B; INT F0(INT X){ int型K。 int型ANS = 0; 以下のために(INT I 1 =; I <= X; I * = 10){ K = X / I / 10 * I。 もし(K * 10 + I-1 < 他のK + = X%I。 もし(K> = I)ANS + = K-I + 1。 } ANSを返します。 } int型F(int型のx、int型Q){ int型K。 int型ANS = 0; (iは1 = INT; I * Q <= X; I * = 10)についての{ K = X / I / 10 * I。 (K * 10 + I * Q> x)のK- = I場合、 もし(K * 10 + I * Q + I-1 <= X)K + = I-1。 他のK + = X%I。 ANS + = K + 1。 } ANSを返します。 } int型のmain(){ ながら(〜のscanf( "%D%D"、&、&B)&&){ IF(A> B)スワップ(B) printf( "%dの"、F0(B)-f0(a-1))。 REP(I、1,10){ のprintf( "%dの"、F(B、I)-f(1、I))。 } のputchar( '\ n'); } 0を返します。 }