湖南科技大学2014 ACM 校赛

时间:2024-10-02 19:19:21


签到积分

经过一段时期的观察,老师觉得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

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <vector>
  5. #include <cmath>
  6. using namespace std;
  7. int main()
  8. {
  9. int n;
  10. int x,ans,k;
  11. int temp=0;
  12. while(~scanf("%d",&n))
  13. {
  14. x=ans=k=0;
  15. do{
  16. // 每次找一个最大的数
  17. x=(int)sqrt(2.0*n)+1;
  18. while(x*(x+1)>2*n)x--;
  19. ans+=x;
  20. n-=x*(x+1)/2;
  21. if(n>0)k++;
  22. //printf("%d %d\n",x,n);
  23. }while(n>1);
  24. if(n==1) ans++;
  25. printf("%d %d\n",ans,k);
  26. }
  27. return 0;
  28. }