题意:
有N个球,就过有限次变换最后达到一种恒定状态
思路:题意不难懂,这种恒定状态也比较好像,他必须要达成1,2,3,4这种序列才能恒定,那么我们就要找到每个状态恒定时的球的数目。1,3,6,10就是等差数列的前n项和。公式s=a1*n+(n-1)*n*d/2。
然后我们就可以用二分去找答案,但是要注意范围,二分的r的范围是2*1e9,因为题目给得数据范围是10的18次方。
#include<stdio.h> #include<math.h> #include<string.h> #include<algorithm> using namespace std; #define ll unsigned long long long long n; long long erfen(long long l,long long r) { long long nn; long long mid; while(l<=r) { mid=(l+r)/2; nn=mid*(mid+1)/2; if(nn==n) return nn; else if(nn>n) r=mid-1; else l=mid+1; } nn=r*(r+1)/2; return nn; } int main() { int t; int casee=0; scanf("%d",&t); while(t--) { scanf("%lld",&n); printf("Case #%d: ",++casee); printf("%lld\n",erfen(1,2*1e9)); } }