解题思路:
为什莫这么做就不多说了,前面的大佬们已经解释过了;这里来说说具体是怎么的到东东每次所报的数(因为我觉得前面大佬说的不算清楚):
例如:n=3,k=13,T=3的时候对应的表如下(带颜色的是东东报的数)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 2 | 4 | 7 | 11 | 3 | 9 | 3 | 11 | 7 |
东东所报的数用 t 表示
第1次:t1=1
第2次:t2=7 --> 7=((1+2+3)+1)%13 --> t2=((1+2+3)+t1)%k
第3次:t2=9 --> 9=((4+5+6)+7)%13 --> t3=((4+5+6)+t2)%k
把1+2+3和4+5+6拿出来说:
1+2+3就是首项a为1公差d为1的等差数的前n项和(n的值为3),首项为1,末项为1+(n-1)*d=1+n-1;
前n项和为(首项+末项)*n/2,即(1+1+n-1)*n/2 = 6;
4+5+6就是首项a为4公差d为1的等差数的前n项和(n的值为3),首项为4,末项为4+(n-1)*d=1+n-1;
前n项和为(首项+末项)*n/2,即(4+4+n-1)*n/2 = 15;
然后把上面的过程完善一下:
东东所报的数用 t 表示
第1次:t1=1
第2次:t2=7 --> 7=((1+2+3)+1)%13 --> t2=((1+2+3)+t1)%k --> t2=((1+1+n-1)*n/2+t1)%k;
第3次:t2=9 --> 9=((4+5+6)+7)%13 --> t3=((4+5+6)+t2)%k --> t2=((4+4+n-1)*n/2+t2)%k;
规律如上;如何衔接每次的结果:
t就不说了看上面就很容易知道了;
至于每次的首项和末项:定义一个变量 a 作为首项,初值为1,下次的首项就是a+n(即这个例子中的4),每次累加n就可以找到首项,末项用等差数列公式a1+(n-1)*d = a+n-1(d=1, n是通过键盘输入的);那么首项、末项都知道了,规律如上总结;可以解题了……
不懂留言,谢谢
注意事项:
参考代码:
#include <cstdio> #include <cstdlib> #include <iostream> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <functional> using namespace std; int main() { int n, k, T; long long sum = 1, t=1, a=1; scanf("%d%d%d", &n, &k, &T); for(int i = 1; i < T; ++i) { t = (((a+a+n-1)*n/2)+t)%k; sum += t; a += n; } printf("%lld\n", sum); return 0; }
0.0分
59 人评分
大佬们,我这怎么错了;跟大佬的方程比了一下,发现我的400 500 300的答案是错的,不明白 #include<stdio.h> int main(void){ long long sum=0; int i=0,n=1,k=0,T=0; scanf("%d%d%d",&n,&k,&T); for(i=0;i<T;i++){ sum+=(i*n*(1+i*n)/2+1)%k; } printf("%lld",sum); return 0; } 57%的错误,用的等差数列求和
公式法好是好,但是我怎么感觉这个公式是没有规律推到出来的,比赛的时候感觉想不出这个公式啊
风的行踪 2022-04-10 13:03:02 |
第一次+1,第二次+2,第三次+3,由此联想到是n*(n+1)/2,结合首项发现是n*(n+1)/2+1,到k后从0开始表明是(n*(n+1)+1)%k。
想知道他是如何报数的,刚开始第一遍报数能明白,到报到11时,题目让报到k-1时就从0重新算,后面那个3是怎么来的?不是说从0开始吗?跟前面的11有啥关系
大佬,我想知道 为什么不能直接用 sum+=(1+((i*n)*(1+i*n))/2)%k sum初值给1 这样的方式计算,就是 第一次 1 第二次 1+(1+2+3+...+n)%k 第三次 1+(1+2+3+...+2n)%k 第四次 1+(1+2+3+...+3n)%k 这样做为什么错了、。。 不太明白
zwxdog 2019-02-11 12:58:45 |
你试试把n,k,t用%lld格式输入试试
zwxdog 2019-02-11 12:59:29 |
我的提交错误一直是14%,改格式后就正确了
石头怪 2019-02-11 13:25:27 |
@zwxzuowen 好,我这试试。3Q3Q ,我用JAVA做的, 我用的都是long 型,但我看你们写的题解 都是用你们这种方法,我也是错误14%,我等改下试试, 我这种思想。。。你感觉有没有错误
天天 2019-03-01 10:00:43 |
t求得是东东第二次的值了,i是从1开始的,应该把第一项的值也加上
风的行踪 2022-04-10 13:04:45 |
你这么做i*n可能有12位随便一乘轻松爆long long,你得想办法让i*n*(i*n+1)/2不爆long long
IP判断 (C语言代码)浏览:924 |
C语言考试练习题_保留字母 (C语言代码)浏览:575 |
A+B for Input-Output Practice (IV) (C++代码)浏览:677 |
淘淘的名单 (C语言代码)浏览:1104 |
C语言程序设计教程(第三版)课后习题9.8 (C语言代码)浏览:616 |
C语言训练-数字母 (C语言代码)浏览:608 |
1908题解浏览:640 |
字符逆序 (C语言代码)浏览:460 |
sizeof的大作用 (C语言代码)浏览:1028 |
局部变量作函数返回值的问题浏览:981 |