/*
プログラミングのお題スレ Part15
https://m...content-available-to-author-only...h.net/test/read.cgi/tech/1564310397/
755デフォルトの名無しさん2019/10/12(土) 13:25:43.66ID:VvSWBOR5
>>748 言われた通りの改定問題
X,Yが与えられる。
X以上Y以下の連続する整数で、数字和の頻度。
もっとも大きい頻度はいくつか。
制約 0 <= X < Y <= 5000億
1) 0 9999 --> 670
合計18が、670ある。>>744の入力値
2) 1234567 9876543 --> 459034
3) 1 500000000000 --> 20406732610
4) 12345678909 498765432123 --> 20000965162
※Y-Xが MAX5000億なので愚直(力技)はきつい。
※頻度表は"桁数*9"程度あるので、最高値出力のみに変更
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXDIGIT 20
#define MAXANUM ((MAXDIGIT*9) + 1)
#define MAXXNUM ((MAXDIGIT+1)/2)
long long fact(int n){
long long p = 1;
while(n > 0){
p *= n;
n--;
}
return(p);
}
long long combi(int n, int k){
long long p = 1;
int i;
for(i = 0; i < k; i++){
p *= n--;
}
return(p / fact(k));
}
void make_base(long long base[MAXDIGIT][MAXANUM]){
int i,j,k;
long long x[MAXXNUM];
int curdigit, curanum, curhalfanum, curxnum;
for(i = 0; i < MAXDIGIT; i++){
for(j = 0; j < MAXANUM; j++){
base[i][j] = 0;
}
}
for(i = 0; i < MAXDIGIT; i++){
curdigit = i+1;
curanum = (curdigit*9)+1;
curhalfanum = (curdigit*9)/2+1;
curxnum = (curdigit+1)/2;
for(j = 0; j < curxnum; j++){
if(j % 2 == 1){
x[j] = -combi(curdigit-1,j);
}else{
x[j] = combi(curdigit-1,j);
}
}
for(j = 0; j < curhalfanum; j++){
base[i][j] = x[j/10];
}
for(j = 1; j < curdigit; j++){
for(k = 1; k < curhalfanum; k++){
base[i][k] = base[i][k] + base[i][k-1];
}
}
if(curdigit % 2 == 1){
j = curhalfanum - 1;
}else{
j = curhalfanum - 2;
}
for(k = curhalfanum; k < curanum; k++){
base[i][k] = base[i][j];
j--;
}
}
}
void make_digitsum_zero_to(long long base[MAXDIGIT][MAXANUM], long long n, long long arr[MAXANUM]){
long long tmp;
int darr[MAXDIGIT] = {};
int maxdigit, offset;
int i,j,k;
for(i = 0; i < MAXANUM; i++){
arr[i] = 0;
}
if(n <= 0){
arr[0]++;
return;
}
i = 0;
for(tmp = n; tmp > 0; tmp /= 10){
darr[i] = tmp % 10;
i++;
}
maxdigit = i;
for(i = 0; i < maxdigit; i++){
offset = 0;
for(j = i+1; j < maxdigit; j++){
offset += darr[j];
}
if(i == 0){
for(j = 0; j < darr[i]; j++){
arr[offset]++;
offset++;
}
}else{
for(j = 0; j < darr[i]; j++){
for(k = 0; k < i*9+1; k++){
arr[offset + k] += base[i-1][k];
}
offset++;
}
}
}
offset = 0;
for(i = 0; i < maxdigit; i++){
offset += darr[i];
}
arr[offset]++;
}
long long max_digit_sum_freq(long long base[MAXDIGIT][MAXANUM], long long X, long long Y){
long long xarr[MAXANUM], yarr[MAXANUM];
long long digit, tmp, anum, maxfreq;
int i;
digit = 0;
for(tmp = Y; tmp > 0; tmp /= 10){
digit++;
}
anum = digit * 9 + 1;
make_digitsum_zero_to(base, X - 1, xarr);
make_digitsum_zero_to(base, Y, yarr);
for(i = 0; i < anum; i++){
yarr[i] -= xarr[i];
}
maxfreq = yarr[0];
for(i = 1; i < anum; i++){
if(maxfreq < yarr[i]){
maxfreq = yarr[i];
}
}
return(maxfreq);
}
#define BUFMAX 128
int main(void){
long long base[MAXDIGIT][MAXANUM];
make_base(base);
long long X, Y;
char buf[BUFMAX], *eptr, *ptr;
while(1){
if(fgets(buf
, BUFMAX
, stdin
) == NULL
){ break;
}
X = strtoll(buf, &eptr, 10);
ptr = eptr;
Y = strtoll(ptr, &eptr, 10);
if(X < 0 || Y <= 0 || X >= Y){
break;
}
printf("%lld %lld --> %lld\n", X
, Y
, max_digit_sum_freq
(base
,X
,Y
)); }
return 0;
}
LyoKICDjg5fjg63jgrDjg6njg5/jg7PjgrDjga7jgYrpoYzjgrnjg6wgUGFydDE1CiAgaHR0cHM6Ly9tLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5oLm5ldC90ZXN0L3JlYWQuY2dpL3RlY2gvMTU2NDMxMDM5Ny8KICAKICA3NTXjg4fjg5Xjgqnjg6vjg4jjga7lkI3nhKHjgZfjgZXjgpMyMDE5LzEwLzEyKOWcnykgMTM6MjU6NDMuNjZJRDpWdlNXQk9SNQogID4+NzQ444CA6KiA44KP44KM44Gf6YCa44KK44Gu5pS55a6a5ZWP6aGMCgogIFgsWeOBjOS4juOBiOOCieOCjOOCi+OAggogIFjku6XkuIpZ5Lul5LiL44Gu6YCj57aa44GZ44KL5pW05pWw44Gn44CB5pWw5a2X5ZKM44Gu6aC75bqm44CCCiAg44KC44Gj44Go44KC5aSn44GN44GE6aC75bqm44Gv44GE44GP44Gk44GL44CCCiAg5Yi257SEIDAgPD0gWCA8IFkgPD0gNTAwMOWEhAoKICAxKSAwIDk5OTkgLS0+IDY3MAogIOOAgOOAgOWQiOioiDE444GM44CBNjcw44GC44KL44CCPj43NDTjga7lhaXlipvlgKQKICAyKSAxMjM0NTY3IDk4NzY1NDMgLS0+IDQ1OTAzNAogIDMpIDEgNTAwMDAwMDAwMDAwIC0tPiAyMDQwNjczMjYxMAogIDQpIDEyMzQ1Njc4OTA5IDQ5ODc2NTQzMjEyMyAtLT4gMjAwMDA5NjUxNjIKCiAg4oC7WS1Y44GMIE1BWDUwMDDlhITjgarjga7jgafmhJrnm7Qo5Yqb5oqAKeOBr+OBjeOBpOOBhOOAggogIOKAu+mgu+W6puihqOOBryLmoYHmlbAqOSLnqIvluqbjgYLjgovjga7jgafjgIHmnIDpq5jlgKTlh7rlipvjga7jgb/jgavlpInmm7QKKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgTUFYRElHSVQgMjAKI2RlZmluZSBNQVhBTlVNICgoTUFYRElHSVQqOSkgKyAxKQojZGVmaW5lIE1BWFhOVU0gKChNQVhESUdJVCsxKS8yKQoKbG9uZyBsb25nIGZhY3QoaW50IG4pewogICAgbG9uZyBsb25nIHAgPSAxOwogICAgd2hpbGUobiA+IDApewogICAgICAgIHAgKj0gbjsKICAgICAgICBuLS07CiAgICB9CiAgICByZXR1cm4ocCk7Cn0KbG9uZyBsb25nIGNvbWJpKGludCBuLCBpbnQgayl7CiAgICBsb25nIGxvbmcgcCA9IDE7CiAgICBpbnQgaTsKICAgIGZvcihpID0gMDsgaSA8IGs7IGkrKyl7CiAgICAgICAgcCAqPSBuLS07CiAgICB9CiAgICByZXR1cm4ocCAvIGZhY3QoaykpOwp9Cgp2b2lkIG1ha2VfYmFzZShsb25nIGxvbmcgYmFzZVtNQVhESUdJVF1bTUFYQU5VTV0pewogICAgaW50IGksaixrOwogICAgbG9uZyBsb25nIHhbTUFYWE5VTV07ICAgIAogICAgaW50IGN1cmRpZ2l0LCBjdXJhbnVtLCBjdXJoYWxmYW51bSwgY3VyeG51bTsKCiAgICBmb3IoaSA9IDA7IGkgPCBNQVhESUdJVDsgaSsrKXsKICAgICAgICBmb3IoaiA9IDA7IGogPCBNQVhBTlVNOyBqKyspewogICAgICAgICAgICBiYXNlW2ldW2pdID0gMDsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZvcihpID0gMDsgaSA8IE1BWERJR0lUOyBpKyspewogICAgICAgIGN1cmRpZ2l0ID0gaSsxOwogICAgICAgIGN1cmFudW0gPSAoY3VyZGlnaXQqOSkrMTsKICAgICAgICBjdXJoYWxmYW51bSA9IChjdXJkaWdpdCo5KS8yKzE7CiAgICAgICAgY3VyeG51bSA9IChjdXJkaWdpdCsxKS8yOwogICAgICAgIAogICAgICAgIGZvcihqID0gMDsgaiA8IGN1cnhudW07IGorKyl7CiAgICAgICAgICAgIGlmKGogJSAyID09IDEpewogICAgICAgICAgICAgICAgeFtqXSA9IC1jb21iaShjdXJkaWdpdC0xLGopOwogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHhbal0gPSBjb21iaShjdXJkaWdpdC0xLGopOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvcihqID0gMDsgaiA8IGN1cmhhbGZhbnVtOyBqKyspewogICAgICAgICAgICBiYXNlW2ldW2pdID0geFtqLzEwXTsKICAgICAgICB9ICAgIAogICAgICAgIGZvcihqID0gMTsgaiA8IGN1cmRpZ2l0OyBqKyspewogICAgICAgICAgICBmb3IoayA9IDE7IGsgPCBjdXJoYWxmYW51bTsgaysrKXsKICAgICAgICAgICAgICAgIGJhc2VbaV1ba10gPSBiYXNlW2ldW2tdICsgYmFzZVtpXVtrLTFdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKGN1cmRpZ2l0ICUgMiA9PSAxKXsKICAgICAgICAgICAgaiA9IGN1cmhhbGZhbnVtIC0gMTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgaiA9IGN1cmhhbGZhbnVtIC0gMjsKICAgICAgICB9CiAgICAgICAgZm9yKGsgPSBjdXJoYWxmYW51bTsgayA8IGN1cmFudW07IGsrKyl7CiAgICAgICAgICAgIGJhc2VbaV1ba10gPSBiYXNlW2ldW2pdOwogICAgICAgICAgICBqLS07CiAgICAgICAgfQogICAgfSAKfQoKdm9pZCBtYWtlX2RpZ2l0c3VtX3plcm9fdG8obG9uZyBsb25nIGJhc2VbTUFYRElHSVRdW01BWEFOVU1dLCBsb25nIGxvbmcgbiwgbG9uZyBsb25nIGFycltNQVhBTlVNXSl7Cglsb25nIGxvbmcgdG1wOwogICAgaW50IGRhcnJbTUFYRElHSVRdID0ge307CiAgICBpbnQgbWF4ZGlnaXQsIG9mZnNldDsKICAgIGludCBpLGosazsKICAgIAogICAgZm9yKGkgPSAwOyBpIDwgTUFYQU5VTTsgaSsrKXsKICAgICAgICBhcnJbaV0gPSAwOwogICAgfQogICAgCiAgICBpZihuIDw9IDApewogICAgICAgIGFyclswXSsrOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIAogICAgaSA9IDA7CiAgICBmb3IodG1wID0gbjsgdG1wID4gMDsgdG1wIC89IDEwKXsKICAgICAgICBkYXJyW2ldID0gdG1wICUgMTA7CiAgICAgICAgaSsrOwogICAgfQogICAgbWF4ZGlnaXQgPSBpOwoKICAgIGZvcihpID0gMDsgaSA8IG1heGRpZ2l0OyBpKyspewogICAgICAgIG9mZnNldCA9IDA7CiAgICAgICAgZm9yKGogPSBpKzE7IGogPCBtYXhkaWdpdDsgaisrKXsKICAgICAgICAgICAgb2Zmc2V0ICs9IGRhcnJbal07CiAgICAgICAgfQoKICAgICAgICBpZihpID09IDApewogICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBkYXJyW2ldOyBqKyspewogICAgICAgICAgICAgICAgYXJyW29mZnNldF0rKzsKICAgICAgICAgICAgICAgIG9mZnNldCsrOwogICAgICAgICAgICB9CiAgICAgICAgfWVsc2V7ICAgCiAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IGRhcnJbaV07IGorKyl7CiAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBpKjkrMTsgaysrKXsKICAgICAgICAgICAgICAgICAgICBhcnJbb2Zmc2V0ICsga10gKz0gYmFzZVtpLTFdW2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb2Zmc2V0Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIG9mZnNldCA9IDA7CiAgICBmb3IoaSA9IDA7IGkgPCBtYXhkaWdpdDsgaSsrKXsKICAgICAgICBvZmZzZXQgKz0gZGFycltpXTsKICAgIH0KICAgIGFycltvZmZzZXRdKys7Cn0KCmxvbmcgbG9uZyBtYXhfZGlnaXRfc3VtX2ZyZXEobG9uZyBsb25nIGJhc2VbTUFYRElHSVRdW01BWEFOVU1dLCBsb25nIGxvbmcgWCwgbG9uZyBsb25nIFkpewogICAgbG9uZyBsb25nIHhhcnJbTUFYQU5VTV0sIHlhcnJbTUFYQU5VTV07CiAgICBsb25nIGxvbmcgZGlnaXQsIHRtcCwgYW51bSwgbWF4ZnJlcTsKICAgIGludCBpOwogICAgCiAgICBkaWdpdCA9IDA7CiAgICBmb3IodG1wID0gWTsgdG1wID4gMDsgdG1wIC89IDEwKXsKICAgICAgICBkaWdpdCsrOwogICAgfQogICAgYW51bSA9IGRpZ2l0ICogOSArIDE7CiAgICAKICAgIG1ha2VfZGlnaXRzdW1femVyb190byhiYXNlLCBYIC0gMSwgeGFycik7CiAgICBtYWtlX2RpZ2l0c3VtX3plcm9fdG8oYmFzZSwgWSwgeWFycik7CgogICAgZm9yKGkgPSAwOyBpIDwgYW51bTsgaSsrKXsKICAgICAgICB5YXJyW2ldIC09IHhhcnJbaV07CiAgICB9CgogICAgbWF4ZnJlcSA9IHlhcnJbMF07CiAgICBmb3IoaSA9IDE7IGkgPCBhbnVtOyBpKyspewogICAgICAgIGlmKG1heGZyZXEgPCB5YXJyW2ldKXsKICAgICAgICAgICAgbWF4ZnJlcSA9IHlhcnJbaV07CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuKG1heGZyZXEpOwp9CgojZGVmaW5lIEJVRk1BWCAxMjgKaW50IG1haW4odm9pZCl7CiAgICBsb25nIGxvbmcgYmFzZVtNQVhESUdJVF1bTUFYQU5VTV07CiAgICBtYWtlX2Jhc2UoYmFzZSk7CiAgICBsb25nIGxvbmcgWCwgWTsKICAgIGNoYXIgYnVmW0JVRk1BWF0sICplcHRyLCAqcHRyOwogICAgd2hpbGUoMSl7CiAgICAgICAgbWVtc2V0KGJ1ZiwgMCwgQlVGTUFYKTsKICAgICAgICBpZihmZ2V0cyhidWYsIEJVRk1BWCwgc3RkaW4pID09IE5VTEwpewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgWCA9IHN0cnRvbGwoYnVmLCAmZXB0ciwgMTApOwogICAgICAgIHB0ciA9IGVwdHI7CiAgICAgICAgWSA9IHN0cnRvbGwocHRyLCAmZXB0ciwgMTApOwogICAgICAgIGlmKFggPCAwIHx8IFkgPD0gMCB8fCBYID49IFkpewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCIlbGxkICVsbGQgLS0+ICVsbGRcbiIsIFgsIFksIG1heF9kaWdpdF9zdW1fZnJlcShiYXNlLFgsWSkpOyAgICAgICAKICAgIH0KICAgIHJldHVybiAwOwp9