UVA 1640カウントの問題

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を返します。
}

 

おすすめ

転載: www.cnblogs.com/sahdsg/p/11869625.html
おすすめ