您的位置:首页 > 其它

蓝桥杯 历届试题 数字游戏 数学

2018-03-18 16:09 399 查看
  历届试题 数字游戏  

时间限制:1.0s   内存限制:256.0MB
   

问题描述
  栋栋正在和同学们玩一个数字游戏。

  游戏的规则是这样的:栋栋和同学们一共n个人围坐在一圈。栋栋首先说出数字1。接下来,坐在栋栋左手边的同学要说下一个数字2。再下面的一个同学要从上一个同学说的数字往下数两个数说出来,也就是说4。下一个同学要往下数三个数,说7。依次类推。

  为了使数字不至于太大,栋栋和同学们约定,当在心中数到 k-1 时,下一个数字从0开始数。例如,当k=13时,栋栋和同学们报出的前几个数依次为:

  1, 2, 4, 7, 11, 3, 9, 3, 11, 7。

  游戏进行了一会儿,栋栋想知道,到目前为止,他所有说出的数字的总和是多少。
输入格式
  输入的第一行包含三个整数 n,k,T,其中 n 和 k 的意义如上面所述,T 表示到目前为止栋栋一共说出的数字个数。
输出格式
  输出一行,包含一个整数,表示栋栋说出所有数的和。
样例输入
3 13 3
样例输出
17
样例说明
  栋栋说出的数依次为1, 7, 9,和为17。
数据规模和约定
  1 < n,k,T < 1,000,000;

思路:

样例 : 1 

             1 + ( 1 +2 + 3 ) = 7         ②

             1 + ( 1 + 2 + 3 ) + ( 4 +5 + 6 )  % 13   =  22 % 13  =  9   ③

 用公式表示的形式 : 1 + n * ( n +  1  )  /  2  = 7

                                    1 +   m * ( m + 1 ) /  2  % 13 = 9           其中(  m = 2 * n )  

                                     ..........

                                     m 只要一直+ n 即可,就能算出来每次的数,对k取余即可,但这样写不知道哪里爆掉了。

//83分,挂了最后一个数据
#include <bits/stdc++.h>
#define LL long long
using namespace std;
LL n , k , t;

LL cal( LL a  ){
return ( a + 1 ) * a / 2 ;
}

int main(){
scanf("%lld%lld%lld",&n,&k,&t);
LL res = 1 ;
for( LL i = 2 , d = n ; i <= t ; i++ , d += n ){
LL tmp = cal( d ) + 1;
tmp %= k ;
res += tmp;
}
cout << res << endl;
return 0 ;
}

那就改成这样:

以② ③ 为例可得出每次的间隔需要+  n*n;

                                     m * ( 1 + m ) / 2  其中( m = 2 * n )  =  n  + 2 * n * n , ①

                                     n + 2 * n * n -   n * ( n + 1 ) / 2  = ( 3 * n*n+n ) / 2 ②

                                    ② - n / (n+1) / 2 = n * n 

                                   .........

所以可以设置一个间隔n*n每次只需要加上这个值每次取余即可,这样就不会爆了。。

COde:

//AC

#include <bits/stdc++.h>
#define LL long long
using namespace std;
LL n , k , t;

LL cal( LL a  ){
return ( a + 1 ) * a / 2 % k;
}

int main(){
scanf("%lld%lld%lld",&n,&k,&t);
LL res = 1 ;
LL mi = cal(n);
LL ans = 1 ;
for( LL i = 2 ; i <= t ; i++ ){
ans += mi ;
mi += n * n ;
ans %= k;
res += ans ;
}
cout << res << endl;
return 0 ;
}


                                     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: