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\n",ans);
    }
    return 0;
}
时间: 2024-12-31 03:51:23

POJ 1019 组合计数的相关文章

POJ 1496 POJ 1850 组合计数

Code Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8256 Accepted: 3906 Description Transmitting and memorizing information is a task that requires different coding systems for the best use of the available space. A well known system is t

POJ 3252 组合计数

Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9149 Accepted: 3248 Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissors', 'Ro,

poj 3088 组合计数,第二类斯特林数

题意:给出n个数字[1,n],问你可以组成多少种不同的序列,其中每一个序列由几个部分组成,每个部分包含几个数字,每部分内数字无序,部分之间数字有序.每个数字最多使用一次,可以不用. 思路:枚举从n个数字中选出i个数字(组合数),再枚举将这i个数字分成j个部分(第二类斯特林数),然后乘上j的全排列. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5

POJ 1019 Number Sequence 题解

这又是一道看似简单,实际挺困难的题目. 本来想做道基础题消遣一下的,没想到反被消遣了-_-|||. 看个人的基础吧,对于数学好的会简单点,但是由于情况太多,需要都考虑全,故此难度应该在4星以上了. 我这里使用的方法就是直接打表,然后直接模拟,利用打表去掉一大段数据,剩下数据量十分小了,故此可以直接模拟. 打表是为了计算前面的周期数,把周期数直接去掉. 主要难点是后面10位数以上的数有2位, 3位,4位等情况要考虑.- 下面使用getNewNums一个函数解决了,想通了,就几行代码,还不用难理解的

Yue Fei&#39;s Battle(组合计数递推)

//求一个直径为 k 的树有多少种形态,每个点的度不超过 3 // 非常完美的分析,学到了,就是要细细推,并且写的时候要细心 还有除法取模需要用逆元 #include <iostream> #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> using namespace std; #define MOD 1000000007 #define L

Number Sequence POJ 1019

给定一个字符串满足规律 11212312345--,求其第k位的数字. 算法思路: 分组来看,第一组1 第二组12 第三组123 第K组[1:k] 1-9组每组1位, 10-99组每组2位 依次类推. 网上大部分解法,用一个数组表示到第k组时,一共需要多少位数,但这个方法需要额外的空间,而且空间大小并不是非常容易确定. 伪代码的思路:sum 表示 while true last-sum = sum; group-size = last-group-size + member-size; // 本

poj 1019 Number Sequence (组合数学)

链接:poj 1019 题意:有一个由数字组成的序列规律为 112123123412345123456123456712345678123456789123456789101234567891011 ... 输入位置n,计算这一串数字第n位是什么数字 分析:模拟分组,把1看做第1组,12看做第2组,123看做第3组... 那么第i组就是存放数字序列为 [1,i]的正整数,但第i组的长度不一定是i, 已知输入查找第n个位的n的范围为(1 ≤ n ≤ 2147483647), 那么至少要有31268

bzoj 1004 Cards 组合计数

这道题考察的是组合计数(用Burnside,当然也可以认为是Polya的变形,毕竟Polya是Burnside推导出来的). 这一类问题的本质是计算置换群(A,P)中不动点个数!(所谓不动点,是一个二元组(a,p),a∈A,p∈P ,使得p(a)=a,即a在置换p的作用后还是a). Polya定理其实就是告诉了我们一类问题的不动点数的计算方法. 对于Burnside定理的考察,我见过的有以下几种形式(但归根结底还是计算不动点数): 1.限制a(a∈A)的特点,本题即是如此(限制了各颜色个数,可以

HDU4675-GCD of Sequence(数论+组合计数)

GCD of Sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 949    Accepted Submission(s): 284 Problem Description Alice is playing a game with Bob. Alice shows N integers a1, a2, -, aN, an