import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/*
プログラミングのお題スレ Part12
//mevius.5ch.net/test/read.cgi/tech/1538096947/755
755 名前:デフォルトの名無しさん[sage] 投稿日:2018/12/03(月) 22:04:03.50 ID:cV13JBu4
[お題]
整数A,B(1<=A<B<=50万)と P(1<=P<=10)が順に与えられる。
A以上B以下の10進数の整数から異なる2つの整数を選ぶ。
その2つの整数を表現するのに使われている(各桁の)数字の種類が
ちょうどP種類である選び方は何通りできるか。
※ 先頭ゼロ詰禁止、実行時間一問1.5秒以内(ideone等で)
1) 8 11 2 --> 4
2) 10 1000 5 --> 207480
3) 44 44444 4 --> 33808313
4) 56785 113452 1 --> ?
5) 102345 480713 6 --> ?
6) 1 500000 7 --> 47440713600
例題1) の補足 "8 11 2" のとき
{8,9,10,11}から2整数を選ぶ。NCR(4,2)=6通りあるなかから
(8,9)(8,11)(9,11)(10,11) の4通りが答え。[]内を使用数字とすると、
例として、(8,11)は[8,1]の2種類, (10,11)は[1,0]の2種類からなる。
対象外は (8,10)は[8,1,0] (9,10)は[9,1,0]で ともに2種類ではない。
※解き方をパックて単純化した問題。
*/
class Ideone
{
{
{
while (true)
{
if (line == null) break;
String[] split
= line.
split(" "); int a
= Integer.
parseInt(split
[0]); int b
= Integer.
parseInt(split
[1]); int p
= Integer.
parseInt(split
[2]); System.
out.
printf("%d %d %d --> %d%n", a, b, p, count
(a, b, p
)); }
}
}
static long count(int a, int b, int p)
{
int[] n = new int[1024];
for (int i = a; i <= b; i++)
{
int bit = 0;
for (int j = i; j > 0; j /= 10)
{
bit |= 1 << j % 10;
}
n[bit]++;
}
long count = 0;
// for (int x = 1; x < 1024; x++)
// {
// for (int y = x; y < 1024; y++)
// {
// if (Integer.bitCount(x | y) == p)
// {
// count += x != y ? n[x] * n[y] : n[x] * (n[x] - 1) / 2;
// }
// }
// }
for (int x = 1; x < 1024; x++)
{
{
count += n[x] * (n[x] - 1) / 2;
}
for (int y = x + 1; y < 1024; y++)
{
{
count += n[x] * n[y];
}
}
}
return count;
}
}
aW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKCi8qCuODl+ODreOCsOODqeODn+ODs+OCsOOBruOBiumhjOOCueODrCBQYXJ0MTIgCi8vbWV2aXVzLjVjaC5uZXQvdGVzdC9yZWFkLmNnaS90ZWNoLzE1MzgwOTY5NDcvNzU1Cgo3NTUg5ZCN5YmN77ya44OH44OV44Kp44Or44OI44Gu5ZCN54Sh44GX44GV44KTW3NhZ2VdIOaKleeov+aXpe+8mjIwMTgvMTIvMDMo5pyIKSAyMjowNDowMy41MCBJRDpjVjEzSkJ1NApb44GK6aGMXQrmlbTmlbBBLEIoMTw9QTxCPD01MOS4hynjgaggUCgxPD1QPD0xMCnjgYzpoIbjgavkuI7jgYjjgonjgozjgovjgIIKQeS7peS4ikLku6XkuIvjga4xMOmAsuaVsOOBruaVtOaVsOOBi+OCieeVsOOBquOCi++8kuOBpOOBruaVtOaVsOOCkumBuOOBtuOAggrjgZ3jga4y44Gk44Gu5pW05pWw44KS6KGo54++44GZ44KL44Gu44Gr5L2/44KP44KM44Gm44GE44KLKOWQhOahgeOBrinmlbDlrZfjga7nqK7poZ7jgYwK44Gh44KH44GG44GpUOeorumhnuOBp+OBguOCi+mBuOOBs+aWueOBr+S9lemAmuOCiuOBp+OBjeOCi+OBi+OAggoK4oC7IOWFiOmgreOCvOODreipsOemgeatouOAgeWun+ihjOaZgumWk+S4gOWVjzEuNeenkuS7peWGhShpZGVvbmXnrYnjgacpCgoxKSA4IDExIDIgLS0+IDQKMikgMTAgMTAwMCA1IC0tPiAyMDc0ODAKMykgNDQgNDQ0NDQgNCAtLT4gMzM4MDgzMTMKNCkgNTY3ODUgMTEzNDUyIDEgLS0+ID8KNSkgMTAyMzQ1IDQ4MDcxMyA2IC0tPiA/CjYpIDEgNTAwMDAwIDcgLS0+IDQ3NDQwNzEzNjAwCgrjgIDkvovpoYwxKSDjga7oo5zotrMgIjggMTEgMiIg44Gu44Go44GNCuOAgOOAgHs4LDksMTAsMTF944GL44KJMuaVtOaVsOOCkumBuOOBtuOAgk5DUig0LDIpPTbpgJrjgorjgYLjgovjgarjgYvjgYvjgokK44CA44CAKDgsOSkoOCwxMSkoOSwxMSkoMTAsMTEpIOOBrjTpgJrjgorjgYznrZTjgYjjgIJbXeWGheOCkuS9v+eUqOaVsOWtl+OBqOOBmeOCi+OBqOOAgQrjgIDjgIDkvovjgajjgZfjgabjgIEoOCwxMSnjga9bOCwxXeOBrjLnqK7poZ4sICgxMCwxMSnjga9bMSwwXeOBrjLnqK7poZ7jgYvjgonjgarjgovjgIIK44CA44CA5a++6LGh5aSW44GvICg4LDEwKeOBr1s4LDEsMF0gKDksMTAp44GvWzksMSwwXeOBpyDjgajjgoLjgasy56iu6aGe44Gn44Gv44Gq44GE44CCCgrjgIDigLvop6PjgY3mlrnjgpLjg5Hjg4Pjgq/jgabljZjntJTljJbjgZfjgZ/llY/poYzjgIIKICovCmNsYXNzIElkZW9uZQp7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgIHsKICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihTeXN0ZW0uaW4pKSkKICAgICAgICB7CiAgICAgICAgICAgIHdoaWxlICh0cnVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IGluLnJlYWRMaW5lKCk7CiAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSBicmVhazsKICAgICAgICAgICAgICAgIFN0cmluZ1tdIHNwbGl0ID0gbGluZS5zcGxpdCgiICIpOwogICAgICAgICAgICAgICAgaW50IGEgPSBJbnRlZ2VyLnBhcnNlSW50KHNwbGl0WzBdKTsKICAgICAgICAgICAgICAgIGludCBiID0gSW50ZWdlci5wYXJzZUludChzcGxpdFsxXSk7CiAgICAgICAgICAgICAgICBpbnQgcCA9IEludGVnZXIucGFyc2VJbnQoc3BsaXRbMl0pOwogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiVkICVkICVkIC0tPiAlZCVuIiwgYSwgYiwgcCwgY291bnQoYSwgYiwgcCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHN0YXRpYyBsb25nIGNvdW50KGludCBhLCBpbnQgYiwgaW50IHApCiAgICB7CiAgICAgICAgaW50W10gbiA9IG5ldyBpbnRbMTAyNF07CiAgICAgICAgZm9yIChpbnQgaSA9IGE7IGkgPD0gYjsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaW50IGJpdCA9IDA7CiAgICAgICAgICAgIGZvciAoaW50IGogPSBpOyBqID4gMDsgaiAvPSAxMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYml0IHw9IDEgPDwgaiAlIDEwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5bYml0XSsrOwogICAgICAgIH0KCiAgICAgICAgbG9uZyBjb3VudCA9IDA7Ci8vICAgICAgZm9yIChpbnQgeCA9IDE7IHggPCAxMDI0OyB4KyspCi8vICAgICAgewovLyAgICAgICAgICBmb3IgKGludCB5ID0geDsgeSA8IDEwMjQ7IHkrKykKLy8gICAgICAgICAgewovLyAgICAgICAgICAgICAgaWYgKEludGVnZXIuYml0Q291bnQoeCB8IHkpID09IHApCi8vICAgICAgICAgICAgICB7Ci8vICAgICAgICAgICAgICAgICAgY291bnQgKz0geCAhPSB5ID8gblt4XSAqIG5beV0gOiBuW3hdICogKG5beF0gLSAxKSAvIDI7Ci8vICAgICAgICAgICAgICB9Ci8vICAgICAgICAgIH0KLy8gICAgICB9CiAgICAgICAgZm9yIChpbnQgeCA9IDE7IHggPCAxMDI0OyB4KyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoSW50ZWdlci5iaXRDb3VudCh4KSA9PSBwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb3VudCArPSBuW3hdICogKG5beF0gLSAxKSAvIDI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoaW50IHkgPSB4ICsgMTsgeSA8IDEwMjQ7IHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEludGVnZXIuYml0Q291bnQoeCB8IHkpID09IHApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gblt4XSAqIG5beV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvdW50OwogICAgfQp9Cg==