解题思路:
为什莫这么做就不多说了,前面的大佬们已经解释过了;这里来说说具体是怎么的到东东每次所报的数(因为我觉得前面大佬说的不算清楚):
例如: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 人评分
#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; }
#include <stdio.h> int main() { int n, k, t, sum = 0, a = 0, b = 1, c = 0, d, e = 0; scanf("%d %d %d", &n, &k, &t); while (b < k - 1) { b = b + a; c = c + 1; a = a + 1; if ((c - 1) % 3 == 0) { sum = sum + b; e = e + 1; } if(e==t) { printf("%d",sum); break; } if (b+a>k) { d = b; b = a - (k - 1 - d) - 1; c = c + 1; a = a + 1; } } return 0; } 大佬们帮我看看这为啥答案错误啊,明明输出的是17......,输出的数也都能对上啊55555
坚果 2023-02-18 21:30:59 |
你的那个%3的3 ,只有样例才符合,因为样例是n=3,要把%3改为%n吧,你下面都没有用到 n
#include<stdio.h> void main() { long long n, k, t; long long sum = 1; scanf("%lld %lld %lld", &n, &k, &t); long long add= 1, count = 1, num = 1; while (count != t) { num += add; if (num >= k) num -= k; add++; if (add % n == 1) { count++; sum+= num; } } printf("%lld\n", sum); } 为什么超时啊?/(ㄒoㄒ)/~~
钟爱mustang 2022-02-16 23:09:18 |
注意题中n,T的值是趋近于100000,当n,T很大时(如n=99999,T=99999);若使count==t;那你这个循环要差不多走99999*99999次;这差不多是1的12次方了,所以会超时;(个人观点,如有错误;望大佬改正(微笑))
#include<stdio.h> int main() { int n,k,t; scanf("%d %d %d",&n,&k,&t); int c = (t-1)*n; int a[c+1]; a[0] = 1; int i,j,ans = 1,sum =0; for(i=1;i<=c;i++){ a[i] = (a[i-1] + ans)%k; ans++; } for(j=0;j<=c;j=j+n){ sum += a[j]; } printf("%d",sum); return 0; } 我显示运行错误71,有大佬知道什么问题吗
20计科周志春 2021-10-27 11:25:45 |
我也是运行错误14,方法一样
钟爱mustang 2022-02-16 23:11:58 |
t=99999;n=99999时;t*n已经很大了!这时a【c+1】不能开在main函数里啦
lqbsy 2022-08-19 20:33:24 |
@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; }
【亲和数】 (C语言代码)浏览:590 |
多输入输出练习1 (C语言代码)浏览:1220 |
C语言程序设计教程(第三版)课后习题1.5 (C++代码)浏览:778 |
2003年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:634 |
C语言程序设计教程(第三版)课后习题6.11 (C语言代码)浏览:2101 |
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:548 |
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:902 |
C语言程序设计教程(第三版)课后习题5.8 (C语言代码)浏览:683 |
C语言训练-自由落体问题 (C语言代码)浏览:650 |
1025题解浏览:798 |