PKU OJ 1019 Number Sequence

2023-11-01 19:38
文章标签 number sequence oj pku 1019

本文主要是介绍PKU OJ 1019 Number Sequence,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

终于0MS AC了,时间复杂度为O(1)

我的感觉是:算法虽然有点复杂,但很容易想到,编程时细心点很快就能AC

#include<stdio.h>
#include<math.h>
long pow10(long n)
{
 if(n==0)return 1;
 else if(n==1)return 10;
 else if(n==2)return 100;
 else if(n==3)return 1000;
 else if(n==4)return 10000;
 else if(n==5)return 100000;
 else if(n==6)return 1000000;
 else return -1;
}
#define MAX 4
int main()
{
 int i,t,n,m;
 long I,l[MAX],len[MAX],X,R,Xp,Y,r,y;
 //compute l
 l[0]=9;
 for(i=1;i<MAX;i++)l[i]=l[i-1]+(i+1)*9*pow10(i);
 //compute len
 len[0]=l[0]*(l[0]+1)/2;
 for(i=1;i<MAX;i++)len[i]=len[i-1]+9*pow10(i)*l[i-1]+(i+1)*9*pow10(i)*(9*pow10(i)+1)/2;
 //input
 scanf("%d",&t);
 while(t--)
 {
  scanf("%ld",&I);
  //Get X
  //compute n
  if(I<=len[0])n=1;
  else if(I>len[MAX-1])n=MAX+1;
  else
  {
   for(i=1;i<MAX;i++)
    if(I<=len[i])
    {
     n=i+1;
     break;
    }
  }
  //compute X and R
  if(n==1)
  {
   X=(long)((sqrt(1+8*(I-1))+1)/2);
   R=I-X*(X-1)/2;
  }
  else
  {
   Xp=(long)((sqrt((n+2.*l[n-2])*(n+2.*l[n-2])+8.*n*(I-1-len[n-2]))+n-2*l[n-2])/(2*n));
   X=Xp+pow10(n-1)-1;
   R=I-len[n-2]+(1-Xp)*l[n-2]-Xp*(Xp-1)/2*n;
  }
  //Get Y
  //compute m
  if(R<=l[0])
  {
   m=1;
   r=R;
  }
  else if(R>l[MAX-1])
  {
   m=MAX+1;
   r=R-l[MAX-1];
  }
  else
  {
   for(i=1;i<MAX;i++)
   {
    if(R<=l[i])
    {
     m=i+1;
     r=R-l[i-1];
     break;
    }
   }
  }
  //compute Y and r
  Y=(r-1)/m+pow10(m-1);
  r=(r-1)%m+1;
  //compute y and output
  y=Y%((long)pow10(m-r+1))/((long)pow10(m-r));
  printf("%ld/n",y);
 }
 return 0;
}
 

这篇关于PKU OJ 1019 Number Sequence的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/325271

相关文章

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然

Jenkins 通过 Version Number Plugin 自动生成和管理构建的版本号

步骤 1:安装 Version Number Plugin 登录 Jenkins 的管理界面。进入 “Manage Jenkins” -> “Manage Plugins”。在 “Available” 选项卡中搜索 “Version Number Plugin”。选中并安装插件,完成后可能需要重启 Jenkins。 步骤 2:配置版本号生成 打开项目配置页面。在下方找到 “Build Env

浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop 机翻 1、条件准备 stk是栈,que是队列。 tt指向的是栈中下标,front指向队头,rear指向队尾。 初始化栈顶为0,队头为0,队尾为-1 #include<iostream>using namespace std;#defi

【UVA】1626-Brackets sequence(动态规划)

一道算是比较难理解的动规。 状态转移分2个: (用d[i][j]表示在i~j内最少需要添加几个括号,保持平衡) 1.如果s[i]和s[j]是一对括号,那么d[i][j] = d[i + 1][j - 1] 2.否则的话 d[i][j] = min(d[i][k],[k + 1][j]); 边界是d[i + 1][i] = 0; d[i][i] = 1; 13993644 162

【Hdu】Minimum Inversion Number(逆序,线段树)

利用线段树在nlogn的时间复杂度内求一段数的逆序。 由于给的序列是由0 ~ n -1组成的,求出初始的逆序之后可以递推出移动之后的逆序数。 #include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const in

【UVA】10534 - Wavio Sequence(LIS最长上升子序列)

这题一看10000的数据量就知道必须用nlog(n)的时间复杂度。 所以特意去看了最长上升子序列的nlog(n)的算法。 如果有2个位置,该位置上的元素为A[i]和A[j],并且他们满足以下条件: 1.dp[i] = dp[j]    (dp[x]代表以x结尾的最长上升子序列长度) 2.A[i] < A[j] 3.i < j 那么毫无疑问,选择dp[i] 一定优于选择dp[j] 那么

【JavaScript】基本数据类型与引用数据类型区别(及为什么String、Boolean、Number基本数据类型会有属性和方法?)

基本数据类型   JavaScript基本数据类型包括:undefined、null、number、boolean、string。基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值。 1)基本数据类型的值是不可变的 任何方法都无法改变一个基本类型的值,比如一个字符串: var name = "change";name.substr();//hangconsole.log

哈理工OJ 2179(深搜)

组合 Time Limit: 1000 MSMemory Limit: 32768 K Total Submit: 7(5 users)Total Accepted: 6(5 users)Rating: Special Judge: No Description 给出一个正整数N,从集合{1,2,3..N} 中找出所有大小为k的子集, 并按照字典序从小到大输出。 Input 第一行是一个整

2015年多校联合训练第一场OO’s Sequence(hdu5288)

题意:给定一个长度为n的序列,规定f(l,r)是对于l,r范围内的某个数字a[i],都不能找到一个对应的j使得a[i]%a[j]=0,那么l,r内有多少个i,f(l,r)就是几。问所有f(l,r)的总和是多少。 公式中给出的区间,也就是所有存在的区间。 思路:直接枚举每一个数字,对于这个数字,如果这个数字是合法的i,那么向左能扩展的最大长度是多少,向右能扩展的最大长度是多少,那么i为合法的情况