POJ 1019 组合计数

链接:POJ 1019

/*****************************************
     author       :  Grant Yuan
     time           :  2014/10/19 14:38
     source       :  POJ 1019
     algorithm:  组合计数
******************************************/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
long long a[33000];
long long s[33000];
long long tt=2147483647;
int t,n;
void Get_a()
{
    a[1]=s[1]=1;
    for(int i=2;i<=32000;i++)
    {
        a[i]=a[i-1]+(int)log10(i*1.0)+1;
        s[i]=s[i-1]+a[i];
        if(s[i]>tt) break;
    }
}
int  Get_ans()
{
    int k,i;
   for(i=1;;i++)
      {
          if(s[i]>=n)  break;
      }
    int pos=n-s[i-1];
   int sum=0;
    for(i=1;;i++)
    {
        sum=sum+1+(int)log10(i*1.0);
      if(sum>=pos) break;
    }
     return (i)/(int)pow((double)10,sum-pos)%10;
}
int main()
{
    scanf("%d",&t);
    memset(a,0,sizeof(a));
    memset(s,0,sizeof(s));
    Get_a();
    while(t--){
       scanf("%d",&n);
       int ans=Get_ans();
       printf("%d
",ans);
    }
    return 0;
}


原文地址:https://www.cnblogs.com/codeyuan/p/4254411.html