2346:Lucky tickets
keyword
BruteForce C++
概要
n(in {2,4,6,8,10})が与えられる。n桁の数字(先頭が0でも良い)のうち、前半と後半のdigit sumが一致するものがいくつあるか求める問題。
流石に10桁をBruteForceは無理だけど、前半部 or 後半部の和はたかだか9*5まで数えれば良いので和がnになる数(5桁以下)を数えておけば良い。後は2乗和をとるだけ。
int getDigitSum(int x){ int ret = 0; int d = 1; while(x/d){ ret += (x/d)%10; d *= 10; } return ret; } int main(){ int div[50][6]; int ans[11]; int i, j; REP(i,50)REP(j,6) div[i][j] = 0; REP(i,10) div[getDigitSum(i)][1]++; REP(i,100) div[getDigitSum(i)][2]++; REP(i,1000) div[getDigitSum(i)][3]++; REP(i,10000) div[getDigitSum(i)][4]++; REP(i,100000) div[getDigitSum(i)][5]++; REP(i,11) ans[i] = 0; REPONE(i,5)REP(j,50){ ans[2*i] += div[j][i]*div[j][i]; } int n; scanf("%d",&n); printf("%d\n",ans[n]); return 0; }