传送门

题目描述

现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:

1/1 , 1/2 , 1/3 , 1/4, 1/5, …

2/1, 2/2 , 2/3, 2/4, …

3/1 , 3/2, 3/3, …

4/1 , 4/2, …

5/1 , …


我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,3/1,2/2,…

输入格式:
整数N(1≤N≤10000000)

输出格式:
表中的第N项

输入样例#1:
7
输出样例#1:
1/4

分析

  • 看到这道题的时候没想那么多,直接模拟O(n)O(n)O(n)的时间复杂度就过了。看了dalao们的八仙过海各显神通的题解,觉得自己还是孤陋寡闻了。除了直接模拟外,还有两种值的学习的方法。
  1. 枚举每一条斜线,找到所求的项所在的斜线,然后,时间复杂度为O(n)O(\sqrt{n})O(n​)。
    斜线上的项可以用如下三角形表示(当然,需要偶数行需要逆序
    1
    2 3
    4 5 6
    7 8 9 10
    可以看出,每行有第iii行有iii项,而且每行中第kkk个元素一定小于或等于行数iii,于是我们就可以对各行进行枚举了。

  2. 二分法:经过观察可以知道,第i条斜线上每项分子和分母的值和都为i+1,其中包含[i∗(i−1)2+1,(1+i)∗i2][\frac{i*(i-1)}{2}+1,\frac{ (1+i)*i} { 2}][2i∗(i−1)​+1,2(1+i)∗i​]这个区间中所有的项,用二分的方法就可以快速找到所求项所在的直线了。
    区间的推导:
    通过上面那个三角形可以看出,第iii层包含iii项,如果要求iii层中共有多少项,可以问题可以转化为等差数列前iii项和,公式为(1+i)∗i2(1+i)*i \over 22(1+i)∗i​。根据这个公式我们可以知道,第iii的第1项为前i−1i-1i−1层的项数和加1,第iii的第iii项为前iii层的项数和
    求该项是该层的第几项:
    设层数为iii,该项是该层的第aaa项,可得
    a=n−i∗(i−1)2a=n-\frac{i*(i-1)}{2}a=n−2i∗(i−1)​

代码如下

  1. 直接模拟。
import java.io.BufferedInputStream;
import java.util.*;
public class Main {static int n,x=1,y=1;public static void main(String[] args) {Scanner cin=new Scanner(new BufferedInputStream(System.in));n=cin.nextInt();for(int i=1;i<n;) {if(i<n) {x++;i++;}while(x-1>0 && i<n) {x--;y++;i++;}if(i<n) {y++;i++;}while(y-1>0 && i<n) {x++;y--;i++;}}System.out.println(y+"/"+x);cin.close();}
}
  1. 枚举斜线
import java.io.BufferedInputStream;
import java.util.*;
public class Main {static int n,i=1;public static void main(String[] args) {Scanner cin=new Scanner(new BufferedInputStream(System.in));n=cin.nextInt();while(i<n) {n=n-i;//n indicate n element in rowi++;//i indicate number of plies}if(i%2==0)System.out.println(n+"/"+(i-n+1));else System.out.println((i-n+1)+"/"+n);cin.close();}
}
  1. 二分法找斜线
import java.io.BufferedInputStream;
import java.util.*;
public class Main {static int n,r,l,mid,a;// r, l, mid all indicate number of pliespublic static void main(String[] args) {Scanner cin=new Scanner(new BufferedInputStream(System.in));n=cin.nextInt();l=1;r=n;while(l<r) {mid=(r+l)/2;if(((mid+1)*mid)/2<n) l=mid+1;else r=mid;}a=n-(l*(l-1))/2; //why l indicate the target layerif(l%2==0)System.out.println(a+"/"+(l+1-a));else System.out.println((l+1-a)+"/"+a);cin.close();}
}

P1014Cantor表(找规律)相关推荐

  1. 点分治问题 ----------- P3727 曼哈顿计划E[点分治+博弈SG函数打表找规律]

    题目链接 解题思路: 1.首先对于每个操作我们实际上是一个博弈问题 对于k=1的操作就是很基础的NIM游戏就是找到一条链的异或和为0 对于k=2的操作通过达打表找规律: 如果s是奇数那么偶数的SG函数 ...

  2. Yet Another Meme Problem(打表找规律)

    Try guessing the statement from this picture http://tiny.cc/ogyoiz. You are given two integers AA an ...

  3. hdu_5894_hannnnah_j’s Biological Test(打表找规律)

    题目链接:hdu_5894_hannnnah_j's Biological Test 题意: 有n个不同的位置围成一个圈,现在要安排m个人坐,每个人至少的间隔为k,问有多少种安排 题解: 先打表找规律 ...

  4. D. Pythagorean Triples(1487D)(打表找规律 + 二分)

    D. Pythagorean Triples(1487D)(打表找规律 + 二分) 题目来源:D. Pythagorean Triples 题意: 给定一个 n,求满足以下条件的数对 (a, b, c ...

  5. Ural 2045. Richness of words 打表找规律

    2045. Richness of words 题目连接: http://acm.timus.ru/problem.aspx?space=1&num=2045 Description For ...

  6. Ural 2037. Richness of binary words 打表找规律 构造

    2037. Richness of binary words 题目连接: http://acm.timus.ru/problem.aspx?space=1&num=2037 Descripti ...

  7. [国家集训队]整数的lqp拆分 数学推导 打表找规律

    题解: 考场上靠打表找规律切的题,不过严谨的数学推导才是本题精妙所在: 求:$\sum\prod_{i=1}^{m}F_{a{i}}$ 设 $f(i)$ 为 $N=i$ 时的答案,$F_{i}$ 为斐 ...

  8. [codeforces 1327E] Count The Blocks 打表找规律+根据规律找公式+优化公式

    Educational Codeforces Round 84 (Rated for Div. 2)   比赛人数13522 [codeforces 1327E]  Count The Blocks  ...

  9. nowcoder_B_114514_打表找规律

    nowcoder_B_114514_打表找规律 114514 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: ...

  10. paulzhou的数学?TAT? 【二分打表找规律】

    paulzhou的数学?TAT? Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Tota ...

最新文章

  1. c#万能视频播放器 (转)
  2. 2021年春季学期-信号与系统-第二次作业参考答案
  3. 整合spring cloud云架构 - Gateway的基本入门
  4. AI:2020年6月22日北京智源大会演讲分享之19:00-19:40《 圆桌论坛:人工智能产业的下一个十年》
  5. C++ 经典面试题
  6. 【数据结构与算法】之深入解析“二叉树的锯齿形层序遍历”的求解思路与算法示例
  7. ONAP发布“阿姆斯特丹”版本,为网络服务自动化制定标准
  8. 联想拯救者r720适合java么_联想拯救者哪个型号好 联想拯救者r720怎么样【详解】...
  9. 诺基亚报告称:到2020年北美电子邮件流量占比将跌至7%
  10. 较简单的字节输入流输出流拷贝文件
  11. 对于整数数组类的算法的终极解决方案
  12. [Leetcode]62. Unique Paths
  13. C++之指针探究(十四):回调函数
  14. unity 线程断点时卡机_Java使用JDI进行线上程序断点信息记录
  15. esp32FreeRTOS教程——内核分配
  16. 2019最新猎豹网校JAVA语言数据结构与算法教程(Java语言 )
  17. oracle按序号排序,Oracle排序以及序号的输出
  18. 日语动词的13种变形
  19. IT培训班有用吗?IT培训包就业是真的吗?
  20. Python脚本调用谷歌浏览器的谷歌翻译

热门文章

  1. optee的error codes
  2. Win32 Edit 文本框追加字符串
  3. 使用 _tprintf 宏兼容多字节字符集和Unicode字符集
  4. 手撕FSG2.0壳(有坑点)
  5. 开源一个自写的病毒技术工具集
  6. 21、HTML <select>标签(下拉列表)
  7. 15、如何选择MySQL存储引擎
  8. internal error:failed to get path of 64-bit Program Files directory
  9. 2.2.4 调度算法: 先来先服务 最短作业优先 最高相应比优先
  10. 通过Cookie实现客户端与服务端会话的维持;