HDU 5062 Beautiful Palindrome Number——BestCoder Round #13

Beautiful Palindrome Number

Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)


Problem Description
A positive integer x can represent as  (a1a2akaka2a1)10  or  (a1a2ak1akak1a2a1)10  of a 10-based notational system, we always call x is a Palindrome Number. If it satisfies  0<a1<a2<<ak9 , we call x is a Beautiful Palindrome Number.
Now, we want to know how many Beautiful Palindrome Numbers are between 1 and  10N .
 

Input
The first line in the input file is an integer  T(1T7) , indicating the number of test cases.
Then T lines follow, each line represent an integer  N(0N6) .
 

Output
For each test case, output the number of Beautiful Palindrome Number.
 

Sample Input
   
   
   
   
2 1 6
 

Sample Output
   
   
   
   
9 258
 

Source
BestCoder Round #13
 
/****************************************************/

出题人的解题思路:

做法1. 对于数字长度为 L \leq 18L18 的Beautiful Palindrome Number有 C^9_{(L+1)/2}C(L+1)/29 个,所以打表就可以了。比如长度为3的Beautiful Palindrome Number数目就是从1-9中选取2个数字 C^9_2C29 。 做法2. 暴力判断每个数字是否满足,因为 n<1000000n<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;
}
菜鸟成长记


你可能感兴趣的:(ACM)