結果
| 問題 | No.491 10^9+1と回文 | 
| コンテスト | |
| ユーザー |  popoyansyo | 
| 提出日時 | 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 long
int pow(int x, int y) {
	int p = 1;
	for (int i = 0; i < y; i++)
	{
		p *= x;
	}
	return p;
}
#define KEY 1000000001
int 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;
}
            
            
            
        