"""
都道府県別人口
"""
#2019/10データ 総人口=126216142
pp19 = [5248552, 1246138, 1226430, 2303160, 965968, 1077057, 1847950, 2868041, 1942312, 1937626, 7337330, 6279026, 13942856, 9200166, 2222004, 1042998, 1137181, 767742, 812056, 2049023, 1988931, 3639226, 7552873, 1779770, 1413959, 2583140, 8823453, 5463609, 1331330, 923721, 555663, 673891, 1891346, 2807987, 1355495, 728633, 956069, 1338811, 697674, 5110113, 814211, 1325205, 1746740, 1134431, 1072077, 1599984, 1454184]
#2017/10データ 総人口=126756594
pp17 = [5320523, 1278450, 1254807, 2322024, 995380, 1101452, 1882666, 2896675, 1961963, 1958409, 7307579, 6255876, 13742906, 9161139, 2266121, 1055893, 1147447, 778329, 823580, 2076017, 2010698, 3673401, 7526911, 1798886, 1412956, 2599313, 8831642, 5502987, 1348257, 944320, 565233, 684668, 1908447, 2830069, 1381584, 743356, 967640, 1363907, 713465, 5110338, 823620, 1353550, 1765518, 1151853, 1088136, 1624801, 1443802]
#2015/10データ 総人口=127094745
pp15 = [5381733, 1308265, 1279594, 2333899, 1023119, 1123891, 1914039, 2916976, 1974255, 1973115, 7266534, 6222666, 13515271, 9126214, 2304264, 1066328, 1154008, 786740, 834930, 2098804, 2031903, 3700305, 7483128, 1815865, 1412916, 2610353, 8839469, 5534800, 1364316, 963579, 573441, 694352, 1921525, 2843990, 1404729, 755733, 976263, 1385262, 728276, 5101556, 832832, 1377187, 1786170, 1166338, 1104069, 1648177, 1433566]
##以下に想定解追加(20/11/10)
import numpy as np
def calall1(ipop):
jnk = np.array(ipop, dtype=np.int32)
sm = np.sum(jnk)
c9, c8, c7 = 111111111, 11111111, 1111111
mx = max(sm - c9, c8) + 5
pct = np.zeros(mx, dtype=np.uint16)
pct[0] = 1
for kn in jnk:
pct[kn :] += pct[: -kn].copy()
# 上のnumpy更新をc++風の配列更新にしたら、
# for(int kn: jnk){ for(int j=mx-kn-1; j>=0; j--) pct[j+kn] += pct[j]; }
oku = pct[sm - c9] if sm >= c9 else 0
return (pct[c7], pct[c8], oku)
idt = ((2019, pp19), (2017, pp17), (2015, pp15))
for yr, vd in idt:
rc = calall1(vd)
print(f"{yr}年 --> {sum(rc)}{rc}\n")
##()は内訳、c7, c8, c9の値
IiIiCuOAgOmDvemBk+W6nOecjOWIpeS6uuWPowoiIiIKIzIwMTkvMTDjg4fjg7zjgr8g57eP5Lq65Y+jPTEyNjIxNjE0MgpwcDE5ID0gWzUyNDg1NTIsIDEyNDYxMzgsIDEyMjY0MzAsIDIzMDMxNjAsIDk2NTk2OCwgMTA3NzA1NywgMTg0Nzk1MCwgMjg2ODA0MSwgMTk0MjMxMiwgMTkzNzYyNiwgNzMzNzMzMCwgNjI3OTAyNiwgMTM5NDI4NTYsIDkyMDAxNjYsIDIyMjIwMDQsIDEwNDI5OTgsIDExMzcxODEsIDc2Nzc0MiwgODEyMDU2LCAyMDQ5MDIzLCAxOTg4OTMxLCAzNjM5MjI2LCA3NTUyODczLCAxNzc5NzcwLCAxNDEzOTU5LCAyNTgzMTQwLCA4ODIzNDUzLCA1NDYzNjA5LCAxMzMxMzMwLCA5MjM3MjEsIDU1NTY2MywgNjczODkxLCAxODkxMzQ2LCAyODA3OTg3LCAxMzU1NDk1LCA3Mjg2MzMsIDk1NjA2OSwgMTMzODgxMSwgNjk3Njc0LCA1MTEwMTEzLCA4MTQyMTEsIDEzMjUyMDUsIDE3NDY3NDAsIDExMzQ0MzEsIDEwNzIwNzcsIDE1OTk5ODQsIDE0NTQxODRdCgojMjAxNy8xMOODh+ODvOOCvyDnt4/kurrlj6M9MTI2NzU2NTk0CnBwMTcgPSBbNTMyMDUyMywgMTI3ODQ1MCwgMTI1NDgwNywgMjMyMjAyNCwgOTk1MzgwLCAxMTAxNDUyLCAxODgyNjY2LCAyODk2Njc1LCAxOTYxOTYzLCAxOTU4NDA5LCA3MzA3NTc5LCA2MjU1ODc2LCAxMzc0MjkwNiwgOTE2MTEzOSwgMjI2NjEyMSwgMTA1NTg5MywgMTE0NzQ0NywgNzc4MzI5LCA4MjM1ODAsIDIwNzYwMTcsIDIwMTA2OTgsIDM2NzM0MDEsIDc1MjY5MTEsIDE3OTg4ODYsIDE0MTI5NTYsIDI1OTkzMTMsIDg4MzE2NDIsIDU1MDI5ODcsIDEzNDgyNTcsIDk0NDMyMCwgNTY1MjMzLCA2ODQ2NjgsIDE5MDg0NDcsIDI4MzAwNjksIDEzODE1ODQsIDc0MzM1NiwgOTY3NjQwLCAxMzYzOTA3LCA3MTM0NjUsIDUxMTAzMzgsIDgyMzYyMCwgMTM1MzU1MCwgMTc2NTUxOCwgMTE1MTg1MywgMTA4ODEzNiwgMTYyNDgwMSwgMTQ0MzgwMl0KCiMyMDE1LzEw44OH44O844K/IOe3j+S6uuWPoz0xMjcwOTQ3NDUKcHAxNSA9IFs1MzgxNzMzLCAxMzA4MjY1LCAxMjc5NTk0LCAyMzMzODk5LCAxMDIzMTE5LCAxMTIzODkxLCAxOTE0MDM5LCAyOTE2OTc2LCAxOTc0MjU1LCAxOTczMTE1LCA3MjY2NTM0LCA2MjIyNjY2LCAxMzUxNTI3MSwgOTEyNjIxNCwgMjMwNDI2NCwgMTA2NjMyOCwgMTE1NDAwOCwgNzg2NzQwLCA4MzQ5MzAsIDIwOTg4MDQsIDIwMzE5MDMsIDM3MDAzMDUsIDc0ODMxMjgsIDE4MTU4NjUsIDE0MTI5MTYsIDI2MTAzNTMsIDg4Mzk0NjksIDU1MzQ4MDAsIDEzNjQzMTYsIDk2MzU3OSwgNTczNDQxLCA2OTQzNTIsIDE5MjE1MjUsIDI4NDM5OTAsIDE0MDQ3MjksIDc1NTczMywgOTc2MjYzLCAxMzg1MjYyLCA3MjgyNzYsIDUxMDE1NTYsIDgzMjgzMiwgMTM3NzE4NywgMTc4NjE3MCwgMTE2NjMzOCwgMTEwNDA2OSwgMTY0ODE3NywgMTQzMzU2Nl0KCgoKIyPku6XkuIvjgavmg7Plrprop6Pov73liqAoMjAvMTEvMTApCgoKCmltcG9ydCBudW1weSBhcyBucAogCmRlZiBjYWxhbGwxKGlwb3ApOgogICAgam5rID0gbnAuYXJyYXkoaXBvcCwgZHR5cGU9bnAuaW50MzIpCiAgICBzbSA9IG5wLnN1bShqbmspCiAgICBjOSwgYzgsIGM3ID0gMTExMTExMTExLCAxMTExMTExMSwgMTExMTExMQogICAgbXggPSBtYXgoc20gLSBjOSwgYzgpICsgNQogICAgcGN0ID0gbnAuemVyb3MobXgsIGR0eXBlPW5wLnVpbnQxNikKICAgIHBjdFswXSA9IDEKICAgIGZvciBrbiBpbiBqbms6CiAgICAgICAgcGN0W2tuIDpdICs9IHBjdFs6IC1rbl0uY29weSgpCiAKICAgICMg5LiK44GubnVtcHnmm7TmlrDjgpJjKyvpoqjjga7phY3liJfmm7TmlrDjgavjgZfjgZ/jgonjgIEKICAgICMgZm9yKGludCBrbjogam5rKXsgZm9yKGludCBqPW14LWtuLTE7IGo+PTA7IGotLSkgcGN0W2ora25dICs9IHBjdFtqXTsgfQogCiAgICBva3UgPSBwY3Rbc20gLSBjOV0gaWYgc20gPj0gYzkgZWxzZSAwCiAgICByZXR1cm4gKHBjdFtjN10sIHBjdFtjOF0sIG9rdSkKIAppZHQgPSAoKDIwMTksIHBwMTkpLCAoMjAxNywgcHAxNyksICgyMDE1LCBwcDE1KSkKZm9yIHlyLCB2ZCBpbiBpZHQ6CiAgICByYyA9IGNhbGFsbDEodmQpCiAgICBwcmludChmInt5cn3lubQgLS0+ICB7c3VtKHJjKX17cmN9XG4iKQogCiMjKCnjga/lhoXoqLPjgIFjNywgYzgsIGM544Gu5YCkCg==