解题思路:
为什莫这么做就不多说了,前面的大佬们已经解释过了;这里来说说具体是怎么的到东东每次所报的数(因为我觉得前面大佬说的不算清楚):
例如: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> #include<math.h> int main() { int n,k,t,m=1,b,a=1; long long s=1; scanf("%d %d %d",&n,&k,&t); for(b=1;b<t;b++) { m=((n*(a+a+n-1))/2+m)%k; s=s+m; a=a+n; } printf("%lld",s); return 0; }
#include<stdio.h> #include<string.h> #include<math.h> int main() { long long int N,K,T,a=1,t; scanf("%lld %lld %lld",&N,&K,&T); long long int sum=0,i; for(i=0;i<T;++i){ t=(1+a*(a-1)/2)%K; sum=sum+t; a=a+N; } printf("%lld",sum); return 0; } 86分,不知道哪里有问题,有大佬知道吗?
御心 2021-02-05 16:59:20 |
我用题解里面正确的代码运行了10组数据,我又用我自己的代码输入同样的数据,结果基本一样,但是当N,K,T都比较大,例如五位数时,结果就有差别了。但我不知道我错在哪里。
201908130304 2021-02-25 21:13:04 |
t的计算有误,比如第二个t应该是7,而你的计算结果为3
简玖 2021-03-09 09:47:48 |
咱俩一模一样 解决没
不知道我的错在哪里,有大佬帮忙看看嘛? #include <stdio.h> #include <stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char *argv[]) { long long n,k,T; scanf("%lld",&n); scanf("%lld",&k); scanf("%lld",&T); int a[100]={0}; int i; a[0]=1; for(i=1;i<(T-1)*n+1;i++) { a[i]=(a[i-1]+i)%13; } long long num=0; for(i=0;i<T;i++) { num+=a[i*n]; } printf("%lld",num); return 0; }
201908130304 2021-02-25 21:08:17 |
这样会超时的,而且数组还会越界
风的行踪 2022-04-10 12:59:28 |
请你仔细读题, 13 这么大个常数写这里,想不错都难,
大佬,我想知道 为什么不能直接用 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 这样做为什么错了、。。 不太明白