解题思路:
为什莫这么做就不多说了,前面的大佬们已经解释过了;这里来说说具体是怎么的到东东每次所报的数(因为我觉得前面大佬说的不算清楚):
例如: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分
45 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#include<stdio.h> int main() { int n,k,T; int sum=0; int number=1; int X=0; int peples=1; int i=0; scanf("%d%d%d",&n,&k,&T); if (n>1&&T<1000000) { while(X<T) { number+=i; if(number>=k-1) { number=0+peples; } i++; if(peples>n||i==1) { X++; peples=1; sum+=number; } peples++; } printf("%d",sum); } return 0; } //史上最难优化的超时代码#include<stdio.h> int main() { int j=0,i,k,n,T,v=0,s=0,m[7]; scanf("%d %d %d",&n,&k,&T); int d=1,x=1; for(i=1;i<3*T-2;i++) { m[0]=1; m[i]=m[i-1]+d; d++; } for(i=0;i<3*T-2;i++) { if(m[i]>=k-1) { m[i]=m[i]-(k-1)-1; } } for(i=0;i<3*T-2;i++) { if(i+1==x) { s=s+m[i]; x=x+3; } } printf("%d\n",s); return 0; }//显示运行时错误,可能是数组下标越界引起的,可不知道哪里有问题请哪个大佬给我看看我这,我输的每个数结果都能对上,就是不对时为啥啊 #include<stdio.h> int main() { int n, k, T; //人数,不超过几,说的个数 int i,j=1,a[1000000]; scanf("%d %d %d", &n ,&k, &T); a[1] = 1; for (i = 2; i <= T* n+1; i++) { a[i] =(a[i-1]+j)%k; j++; } long long int sum = 0; //a[1] a[1+n] a[1+n+n] for (i = 1; i <= (T-1)*n+1; i+=n) { sum += a[i]; } printf("%lld", sum); return 0; }@ipad @mustang #include<stdio.h> int main() { int n, k, T; //人数,不超过几,说的个数 int i,j=1,a[1000000]; scanf("%d %d %d", &n ,&k, &T); a[1] = 1; for (i = 2; i <= T* n+1; i++) { a[i] =(a[i-1]+j)%k; j++; } long long int sum = 0; //a[1] a[1+n] a[1+n+n] for (i = 1; i <= (T-1)*n+1; i+=n) { sum += a[i]; } printf("%lld", sum); return 0; }