一道水模拟,可以直接算。但菜鸡不会……
题目大意
原题导航:https://www.luogu.com.cn/problem/P1014
一个表格:
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字型排列,即:
问第N项是什么。
做法
这样的表格比较难看,我们先把它转换一下:
11
21,12
13,22,31
41,32,23,14
...
这样将每一行都分离了出来,可以发现,每行的数的数量形成了等差数列。第一行有1个数,第二行有2个数……
那么,我们就要将第N项所在行找出来:
1 2 3 4 5
| int add=1; while(n>add){ n-=add; add++; }
|
当然,这个可以直接算出来,没有必要暴力枚举,但数据太水了,依旧可以过。
知道它是第几行的,我们就要看他是什么了。不难发现,当add
是奇数的时候,add
行分母依次为从1递增到add
的数列,分子为从add
递减至1的数列;而当add
是偶数的时候,add
行分子依次为从1递增到add
的数列,分母为从add
递减至1的数列。
可以得到以下的代码:
1 2 3 4 5 6 7
|
if(add%2==1){ printf("%d/%d",add-n+1,n); }else{ printf("%d/%d",n,add-n+1); }
|
完整AC代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include<bits/stdc++.h> using namespace std; int main(){ int n; scanf("%d",&n); int add=1; while(n>add){ n-=add; add++; } if(add%2==1){ printf("%d/%d",add-n+1,n); }else{ printf("%d/%d",n,add-n+1); } }
|