LightOJ - 1008--Fibsieve`s Fantabulous Birthday (找规律)
题目描述:按照题目所给的顺序填充排列自然数,给你一个n,输出n在这个特殊序列中所在的坐标。
思路:一道找规律的题,数据的排列可以类似的看做一个蛇形路段,每一个对勾的拐点就是一个完全平方数,并且开方数刚好就是偶数行的横向坐标或者奇数行的纵坐标,然后再次观察可找到每个对勾的拐角点(也就是说图形的对角线就是本行的完全平方数减去上一行的行数就行),最后根据对角线的位置可以确定n的另外一个坐标。(估计你肯定看不下去,还是看代码吧!)
需要注意的一点就是数据范围别用 int 就行。
#include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> #include <queue> #include <stack> #define LL long long using namespace std; int main() { LL T,i,j,n,m,len=1; double ans; scanf("%lld",&T); while(T--) { scanf("%lld",&n); printf("Case %lld: ",len++); ans=sqrt(n); m=(LL)ans; if(ans>m) m++; LL k=m*m-m+1; if(m%2>0) { if(n<k) printf("%lld %lld\n",m,m-(k-n)); else printf("%lld %lld\n",m-(n-k),m); } else { if(n>k) printf("%lld %lld\n",m,m-(n-k)); else printf("%lld %lld\n",m-(k-n),m); } } return 0; }
后记:最怕的就是找规律,刚开始就是被那张图给吓到了,英语也不好,看不懂题的意思,所以比较怵找规律的题。还是继续努力吧!!!