poj 1019 Number Sequence (数学)

链接:http://poj.org/problem?id=1019

分析:就是计数的问题。。可以先算出112123...m共有多少位,具体式子看代码。。然后二分取一个最大的小于n的m,接下来考虑123...m有多少位,再二分一下求解就可以了。。具体式子还是看代码。。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 typedef long long ll;
 6 ll q[10],powten[11];
 7 long long p[100005];
 8 void CalQ(){
 9     powten[0]=1;
10     for(int i=1;i<=10;i++)powten[i]=powten[i-1]*10;
11     q[0]=0;
12     for(int i=1;i<=9;i++)
13         q[i]=q[i-1]+9*i*powten[i-1];
14 }
15 ll f(int x){
16     if(x==0)return 0;
17     int len=0,x0=x;
18     while(x0){
19         len++;x0/=10;
20     }
21     if(len==1)return x;
22     return q[len-1]+(ll)len*(x-powten[len-1]+1);
23 }
24 void CalP(){
25     CalQ();
26     p[0]=0;
27     p[1]=1;
28     for(int i=2;i<100005;i++){
29         p[i]=p[i-1]+f(i);
30 //        if(i%500==0){
31 //            i=i;
32 //            memset(p,0,i*sizeof(int));
33 //        }
34     }
35 }
36 int dich(int n){
37     int l=0,r=4e4,m=(l+r)/2;
38     while(l<=r&&l!=m){
39         ll t=p[m];
40         if(t==n)return m-1;
41         else if(t>n)r=m;
42         else l=m;
43         m=(l+r)/2;
44     }
45     return r-1;
46 }
47 int Dich(int n){
48     int l=0,r=n,m=(l+r)/2;
49     while(l<=r&&l!=m){
50         int t=f(m);
51         if(t==n)return m;
52         else if(t>n)r=m;
53         else l=m;
54         m=(l+r)/2;
55     }
56     return r-1;
57 }
58 int solve(int n){
59     int m=dich(n);
60     int h=Dich(n-p[m]);
61     int k=n-f(h)-p[m]-1;
62     if(k==-1)return h%10;
63     char str[15];
64     sprintf(str,"%d",h+1);
65     return str[k]-‘0‘;
66 }
67 char s[1000000];
68 //void Gets(){
69 //    s[0]=‘\0‘;
70 //    char str[5];
71 //    for(int i=1;i<500;i++){
72 //        for(int j=1;j<=i;j++){
73 //            sprintf(str,"%d",j);
74 //            strcat(s,str);
75 //        }
76 //    }
77 //}
78 //int test(int n){
79 //    return s[n-1]-‘0‘;
80 //}
81 int main(){
82     CalP();
83     //Gets();
84     //freopen("e:\\out.txt","w",stdout);
85     //freopen("e:\\in.txt","r",stdin);
86     int t,n;
87     scanf("%d",&t);
88     n=1;
89     while(t--){
90         scanf("%d",&n);
91         //int a=test(n),b=solve(n);
92         //printf("%d ",a);
93         printf("%d\n",solve(n));
94         //if(a!=b)cout<<n<<"***************\n"<<endl;
95     }
96     return 0;
97 }
时间: 2024-10-14 16:29:02

poj 1019 Number Sequence (数学)的相关文章

POJ 1019 Number Sequence 题解

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

poj 1019 Number Sequence 【组合数学+数字x的位宽函数】

题目地址:http://poj.org/problem?id=1019 Number Sequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35680   Accepted: 10287 Description A single positive integer i is given. Write a program to find the digit located in the position i in

poj 1019 Number Sequence 二分

Number Sequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 34391   Accepted: 9879 Description A single positive integer i is given. Write a program to find the digit located in the position i in the sequence of number groups S1S2...

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

POJ 1019 Number Sequence (循环递增序列的的第K个值)

Number Sequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35823   Accepted: 10340 Description A single positive integer i is given. Write a program to find the digit located in the position i in the sequence of number groups S1S2..

POJ 1019 Number Sequence

题意:问有如下规律的数列的第n项是啥: 11212312341234512345612345671234567812345678912345678910123456789101112345678910 解法:每段连续数字为一组,算每组序列的长度,累加直到超过n,说明n在前一组连续数字内,枚举组内数字,累加长度直到超过n,说明n在前一数字中,找出这一数位输出. 总的来说就是一有点恶心的模拟……最后我想说…… 注意longlong 对……每次都记不住……_(:з」∠)_ 代码: #include<s

HDU 1005 Number Sequence (数学规律)

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 104190    Accepted Submission(s): 25232 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A

HDU 1005 Number Sequence 数学

Problem Description A number sequence is defined as follows:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.Given A, B, and n, you are to calculate the value of f(n). Input The input consists of multiple test cases. Each test case cont

PKU 1019 Number Sequence(模拟,思维)

题目 以下思路参考自discuss:http://poj.org/showmessage?message_id=176353 /*我的思路: 1.将长串数分成一个个部分,每个部分是从1到x的无重复的数字序列 2.每个序列比前一个序列多的位数是他的最后一个数的位数,如12345678910比123456789多最后一个10, 即多占了两位,由此可推算出任何一个序列的长度 3.输入位置n,则从1到n查找,每次位置移动一个序列的长度,如果第j个加上序列长度超过n,则输出j这个整数的从个位数第j-n+1