题解 P1014 【Cantor表】的几种做法

「已注销」

2017-12-10 11:13:35

Solution

算法1:模拟,按题意一个个枚举 时间复杂度O(n),可以通过本题n≤10^7 算法2:发现Z字形的每条斜线可以快速枚举,即枚举 1/1 , 1/2 , 3/1 , 1/4 , 5/1 , 1/6……找到要求的第n项所在斜线,再一个个枚举或计算得出答案 时间复杂度O(√n),可以通过n≤10^14 算法2.5:枚举第n项在哪一行,计算得出答案,比算法2好写, 时间复杂度同算法2 算法3:发现第i条斜线(即分子分母之和=i+1的所有项)中包含i\*(i-1)/2+1至i\*(i+1)中的每一项,所以可以二分分子分母之和,再根据分子分母之和的奇偶性直接计算第n项 时间复杂度O(㏒₂n),可以通过n≤10^18,加上高精可通过n≤10^1000 二分参考代码: ```cpp #include<iostream> #include<cmath> using namespace std; int main(){ long long l=1,r,mid,n,a; cin>>n; r=n; while(l<r){ mid=(l+r)/2; if(mid*(mid+1)/2<n)l=mid+1; else r=mid; } a=n-l*(l-1)/2; if(l%2==0)cout<<a<<'/'<<l+1-a; else cout<<l+1-a<<'/'<<a; return 0; } ```