結果
問題 | No.491 10^9+1と回文 |
ユーザー |
![]() |
提出日時 | 2017-03-12 22:46:44 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 2 ms / 1,000 ms |
コード長 | 1,736 bytes |
コンパイル時間 | 538 ms |
コンパイル使用メモリ | 59,320 KB |
実行使用メモリ | 6,824 KB |
最終ジャッジ日時 | 2024-10-01 08:35:43 |
合計ジャッジ時間 | 2,745 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 103 |
ソースコード
//#include "stdafx.h"#include <iostream>#include <vector>using namespace std;#define int long longint pow(int x, int y) {int p = 1;for (int i = 0; i < y; i++){p *= x;}return p;}#define KEY 1000000001int digit(int n) {for (int i = 1; ; i++){if (n <= pow((int)10, i)) {return i;}}return -1;}int rightCount(int digit) {int n = digit - 10;int sum = 0;for (int i = 1; i <= n; i++){sum += pow((int)9, i % 2);}return sum;}void genkeys(int keys[], int pd) {//cout << pd << endl;if (pd == 1) { keys[0] = 1; return; }else if (pd == 2) { keys[0] = 11; keys[1] = 1; return; }for (int i = 0; i < pd / 2; i++){keys[i] = pow((int)10, pd - 1 - i) + pow((int)10, i);}if (pd % 2 == 1) keys[pd / 2] = pow((int)10, pd / 2);}int genNum(int keys[], int keyCount[], int pd) {int num = 0;for (int i = 0; i < pd / 2; i++){num += keys[i] * keyCount[i];}if (pd % 2 == 1) num += keys[pd / 2] * keyCount[pd / 2];return num * KEY;}int check(int n) {int d = digit(n);if (d < 10) return 0;int prev = pow((int)10, d - 1) - 1;int right = check(prev);//cout << right << endl;int pd = d - 9;int keys[5];genkeys(keys, pd);int keyCount[5] = { 1, 0, 0 ,0 ,0 };int ex = 0;int keysCount = (pd / 2) + (pd % 2 == 0 ? 0 : 1);while (true) {int num = genNum(keys, keyCount, pd);if (n < num) {break;}//cout << genNum(keys, keyCount, pd) << endl;ex++;keyCount[keysCount - 1]++;for (int i = keysCount - 1; 0 < i; i--) {if (keyCount[i] == 10){keyCount[i] = 0;keyCount[i - 1]++;}else {break;}}}return (ex + right);}signed main() {int t;cin >> t;cout << check(t) << endl;return 0;}