ZOJ2185 简单分块 找规律

来源:互联网 发布:歌斐资产 知乎 编辑:程序博客网 时间:2024/06/11 09:45

初步找大概位置,然后找精确位置,算是简单化的分块吧!

#include<cstdio>#include<cstdlib>#include<iostream>using namespace std;int c[5000];int num=0;void _get(){      int  k=1,m;  while(true){m=(k+1)*k/2;if(m>10000000) break;c[++num]=m;k++;}}void _work(int v){ int k=num,a,b,V=v; for(int i=2;i<=num;i++)  if(c[i-1]<=v&&c[i]>v) {k=i-1;break;} if(k%2==1) {a=1;b=k;    if(c[k]==v) { printf("TERM %d IS %d/%d\n",V,a,b); return ;}    b++;v--;    if(c[k]==v) { printf("TERM %d IS %d/%d\n",V,a,b); return ;}while(b>1){a++;b--;v--;   if(c[k]==v) {printf("TERM %d IS %d/%d\n",V,a,b); return;}}     }    else {a=k;b=1;if(c[k]==v) { printf("TERM %d IS %d/%d\n",V,a,b); return ;}     a++;v--;if(c[k]==v) { printf("TERM %d IS %d/%d\n",V,a,b); return ;}while(a>1){a--;b++;v--;   if(c[k]==v) {printf("TERM %d IS %d/%d\n",V,a,b); return;}} }}int main(){int n;_get();     while(~scanf("%d",&n))      _work(n);return 0;}


原创粉丝点击