洛谷1014 Cantor表

emnnn今天是2020/8/24

这题一开始拿到我第一反应是——找规律

1,1 1,2 1,3 1,4 1,5

2,1 2,2 2,3 2,4 2,5

3,1 3,2 3,3 3,4 3,5

4,1 4,2 4,3 4,4 4,5

5,1 5,2 5,3 5,4 5,5

蒟蒻把这个表格的每一个点标了坐标,很好我们接着看。

1/1 1/2 1/3 1/4 1/5

2/1 2/2 2/3 2/4 2/5

3/1 3/2 3/3 3/4 3/5

4/1 4/2 4/3 4/4 4/5

5/1 5/2 5/3 5/4 5/5

这是题目中给出的表,发现什么了吗?

表2的值=i/j!!!

但蒟蒻这里还要给出第二种解法!

二分!

如果有人不会二分可以搜这个网址:https://www.cnblogs.com/wkfvawl/p/9475939.html

这里面有详细的讲解,在这里蒟蒻就先不讲了,直接上思路

发现第i条斜线(即分子分母之和=i+1的所有项)中包含i*(i-1)/2+1至i*(i+1)中的每一项,所以可以二分分子分母之和,再根据分子分母之和的奇偶性直接计算第n项

时间复杂度O(㏒₂n),可以通过n≤1018,加上高精可通过n≤101000。

这算法不仅快还好打

把我们就上代码了!

#include<bits/stdc++.h>

using namespace std;

int main(){

    long long l=1,r,mid,n,a;

    scanf("%d",&n);

    r=n;

    while(

        mid=(l+r)/2;

        if(mid*(mid+1)/2

        else r=mid;

    }

    a=n-l*(l-1)/2;

    if(l%2==0)printf("%d/%d",a,l+1-a);

    else printf("%d/%d",l+1-a,a);

    return 0;
   }

这是蒟蒻的第一篇题解,有不好的地方可以提出,谢谢

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值