2019 年百度之星·程序设计大赛 - 初赛一 1005 Seq(数学规律)
2019 年百度之星·程序设计大赛 - 初赛一 1005 Seq(数学规律)
http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=861&pid=1005
Sample Input
5 1 2 3 4 5
Sample Output
1 1 0 3 0
这题第一反应打表,先计算,后查询输出,后来注意到数据太大,行不通
索性把打好的表输出来找规律,果然有规律可循
奇数和偶数有不同的规律,但周期都是3
大家可以把下面的代码跑一下,分别输出1到30之间的奇数和偶数项的结果,试着自己找一找规律
代码如下:
#include <stdio.h> #include <string.h> #include <iostream> #include <string> #include <math.h> #include <algorithm> #include <queue> #include <set> #include <math.h> const int INF=0x3f3f3f3f; typedef long long LL; const int mod=1e9+7; const double PI=acos(-1); const int maxn=1e5+10; using namespace std; int main() { int T; scanf("%d",&T); while(T--) { LL n; scanf("%lld",&n); if(n&1==1)//奇数项 { LL num,a,b; int p,q; num=(n+1)/2;//算一下是第几个奇数 p=1; q=0; a=num/3; b=num%3; if(b==1) printf("%lld\n",p+4*a); else if(b==2) printf("%lld\n",q+a); else if(b==0) printf("%lld\n",q+a-1); } else//偶数项 { LL num,a,b; num=n/2;//算一下是第几个偶数 if(n==2) //把2当做了特殊项,便于以后计算 printf("1\n"); else { a=(num-1)/3; b=(num-1)%3; if(b==1) printf("%lld\n",n-1); else printf("%lld\n",n/2); } } } return 0; }