签到积分
经过一段时期的观察,老师觉得ACM实验室的利用率太低了,于是决定雇用老套的签到积分制度,但考虑到ACMer的成长必须持之以恒,因此,专门设计了一种激励连续签到的规则。
签到积分规则如下:
1)每天只要来到ACM实验室学习并录入指纹,即算签到成功,可获取相应的积分;若某天未签到,则当天计0个积分。
2)连续签到时,第1天签到可获取1个积分,第2天签到可获取2个积分,……,第n天可获取n个积分。
3)如果中途未签到,则再签到时,连续天数重新从1开始计算。
自从有了积分制度后,ACM实验室的利用率大大的提高。
有一天集训队队长在签到后向大家出了一个难题,她向大家亮出了自己的签到积分总和,然后要大家算出她至少要签到多少天,并算出从开始签到到最后签到之间至少有多少天未签到。
输入
有多组测试数据
每行输入1个一个正整数n(1<=n<=500500)
输出
与输入的测试数据相对应,每行输出2个数据,一个是签到的最少天数,一个是中途未签到的最少天数,2个数用空格隔开。
样例输入
5
8
22
25
27
28
样例输出
4 2
5 2
7 1
9 2
9 1
7 0
-
#include <iostream>
-
#include <cstdio>
-
#include <cstring>
-
#include <vector>
-
#include <cmath>
-
using namespace std;
-
-
-
int main()
-
{
-
int n;
-
int x,ans,k;
-
int temp=0;
-
while(~scanf("%d",&n))
-
{
-
x=ans=k=0;
-
do{
-
// 每次找一个最大的数
-
x=(int)sqrt(2.0*n)+1;
-
while(x*(x+1)>2*n)x--;
-
ans+=x;
-
n-=x*(x+1)/2;
-
if(n>0)k++;
-
//printf("%d %d\n",x,n);
-
}while(n>1);
-
if(n==1) ans++;
-
printf("%d %d\n",ans,k);
-
}
-
-
return 0;
-
}