https://codeforces.com/contest/1560/problem/C
INPUT
7
11
14
5
4
1
2
1000000000
OUTPUT
2 4
4 3
1 3
2 1
1 1
1 2
31623 14130
题意
看图应该能理解图内数的排列规律(就每次沿一个右上角正方形扩张)然后给出一个数,求出该数在图的第几行第几列
做法
先找出该数内的最大正方形,然后就从列开始数,如果列超出了最大正方形的边长,就稍微更改一下行列输出即可
下面拿个举例 : 8
所以我设cnt从1开始遍历,然后直到cnt * cnt(边长的平方代表面积内含的数)大于8,即cnt = 2.
所以8内最大正方形为 2×2.然后将8 - (cnt * cnt)即剩下的数,然后从x轴为cnt + 1开始遍历下去y值,
当剩下的数大于cnt + 1(在列中装不完)所以y轴固定为cnt + 1,反向从x轴cnt+1开始数x轴上的位置。
AC代码
ps:13行中 cnt * 2 - n 是化简后的 ,原式为cnt - (n - cnt ) ε=ε=ε=┏(゜ロ゜;)┛
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T,n;cin>>T;
while(T--)
{
cin>>n;
int cnt = 1;
while(cnt * cnt < n) { cnt++; }
n -= (cnt - 1) * (cnt - 1);
if(n <= cnt) cout<<n<<" "<<cnt<<endl;
else cout<<cnt<<" "<<cnt * 2 - n<<endl;
}
return 0;
}
如果有问题尽情提出哈
几句牢骚
暑假培训后咸鱼了两周,现在开始补cf,发现连1200分的题切得都有点吃力 orz
假期的st表,树状数组,线段树,各种数据结构感觉都还给学长了,得好好补题了
暑期选拔进集训队还是很nice的
ε=ε=ε=┏(゜ロ゜;)┛