[化合物] 、数字0,1,2,3の数を数え…,9 1&GTの範囲であり、n | MDIGITS
スレッド: HTTP://vn.spoj.com/problems/MDIGITS/
二つの整数のための, B. 間のすべての数字を書きます, B; 愛の歌 2 この数.
算出された各数字を参照してください。 0, 1, .., 9 何回も出現する各番号.
例えば, =の場合 1024 aとb = 1032, 範囲は次のようになります
1024 1025 1026 1027 1028 1029 1030 1031 1032
と 10 数 0, 10 数 1, 7 数 2, …
我々は0-から数字を数えます>ザ·, 0->Bは、各番号の桁数を回しました (0->9) のBマイナスの.
でのリーグの歴史 31627 (数と比較し 0), 私は、次のターンを置きます:
最初の列の数を考えてみましょう, 数 0,1,2 10 ^ 4の番号, 数 3 必要があります 1627+1 = 1628 数 (凍結上記のイメージに 0 ないアウト, 我々は最終的に折り畳みます 00000)
カラムからのソウ 2 オンワード (写真を見ます) これは、グループに分けることができます (3 クラスタ) しかし数0-の各クラスタ>9 4 * 10 ^ 3の数であります.
だから今私はいくつかを検討したいです 1627 気にしないで !
完了すると、注目カウントマイナス数 0 無効 (001) その後 2 数 0 上部には有効ではありません.
#include <stdio.h> #include <math.h> int A[] = {1,10,100,1000,10000,100000,1000000,10000000,100000000}; void pro(int num, int len, int count[]) { int n, i; n = num / A[len]; if (num ==0) { count[n] += len+1; return; } for(i=0;i<n;i++) count[i] += A[len]; count[n] += num % A[len] + 1; if(len==0) return; for(i=0;i<10;i++) count[i] += n*len*A[len-1]; pro(num % A[len], len-1, count); } int main() { int p1, p2, a, b, c, i; while(scanf("%d%d",&a,&b)==2 && a+b) { if(a>b) { c = a; a = b; b = c; } a--; int count1[10] = {1}; int count2[10] = {1}; if(a) { p1 = (int)floor(log10(a)); pro(a, p1, count1); for(i=0; i<=p1; i++); count1[0] -= A[i]; } p2 = (int)floor(log10(b)); pro(b, p2, count2); for(i=0; i<=p2; i++) count2[0] -= A[i]; printf("%d",count2[0]-count1[0]); for(i=1; i<10; i++) printf(" %d",count2[i]-count1[i]); printf("n"); } return 0; }
最近のコメント