2 1 6
9 258
出题人的解题思路:
做法1. 对于数字长度为 L≤18 的Beautiful Palindrome Number有 C(L+1)/29 个,所以打表就可以了。比如长度为3的Beautiful Palindrome Number数目就是从1-9中选取2个数字 C29 。 做法2. 暴力判断每个数字是否满足,因为 n<1000000 。 做法3. 手算一下,因为最大的已经给出了。题意:定义x是一个美丽回文数,当前仅当x能表示成(a1a2…akak…a2a1)10 或者 (a1a2…ak−1akak−1…a2a1)10的十进制形式,同时满足 0<a1<a2<…<ak≤9
解题思路:因为本题的N比较小,而且最大的情况也已经出现在样例中,故不妨我们可以先手算求出7种情况对应的结果,这样询问时的复杂度就是O(n)了。
另外,我们可以发现2k位数与2k-1位数的情况是一样的,比如说N=1时,有1~9九种情况,而N=2时,同样有九种美丽回文数:11、22、33、44、55、66、77、88、99。然后我们又知道了N=6的美丽回文数个数,所以只需算出N=3的就可以知道所有的情况了。
在N=3时,x形如a1a2a1,a1=1时,a2有8种情况;a1=2时,a2有7种情况;……;依次类推,a1=8时,a2有1种情况。共计8+7+…+1=(8+1)*8/2=36种
故
N 1 2 3 4 5 6
Num 9 9+9 9+9+36 9+9+36+36 9+9+36+36+84 9+9+36+36+84+84
9 18 54 90 174 258
还有就是不要忘了N=0的情况,结果是为1的
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #include<stack> #include<math.h> #include<vector> #include<map> #include<set> #include<stdlib.h> #include<cmath> #include<string> #include<algorithm> #include<iostream> #define exp 1e-10 using namespace std; const int N = 105; const int inf = 2147483647; const int mod = 2009; int main() { int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); switch(n) { case 0:puts("1");break; case 1:puts("9");break; case 2:puts("18");break; case 3:puts("54");break; case 4:puts("90");break; case 5:puts("174");break; case 6:puts("258"); } } return 0; }菜鸟成长记