蓝桥杯 历届试题 数字游戏 数学
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分,挂了最后一个数据
那就改成这样:
以② ③ 为例可得出每次的间隔需要+ 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:
时间限制: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 ; }
相关文章推荐
- 蓝桥杯 -- 历届试题 数字游戏【数学题,值得一看】
- 蓝桥杯--历届试题 数字游戏
- 蓝桥杯 历届试题 数字游戏
- 蓝桥杯 历届试题之数字游戏
- 蓝桥杯历届试题——数字游戏
- 蓝桥杯 历届试题 数字游戏
- 蓝桥杯 历届试题 数字游戏
- 蓝桥杯 历届试题 数字游戏 (已AC)
- 蓝桥杯历届试题之数字游戏
- 问题 1443: [蓝桥杯][历届试题]数字游戏
- 问题 1443: [蓝桥杯][历届试题]数字游戏
- 蓝桥杯 历届试题 数字游戏
- 蓝桥杯 历届试题 数字游戏 部分超时
- 蓝桥杯 历届试题 数字游戏 (规律)
- 蓝桥杯 历届试题 数字游戏
- 蓝桥杯 历届试题 数字游戏(Java解题)
- 蓝桥杯 历届试题 7对数字 直角三角形
- 蓝桥杯 历届试题 回文数字
- 1503140110-蓝桥杯-历届试题 回文数字
- 历届试题 数字游戏