咖啡


私信TA

用户名:Tianxn

访问量:138582

签 名:

十年OI一场空,不开LL见祖宗。

等  级
排  名 10
经  验 27363
参赛次数 10
文章发表 197
年  龄 22
在职情况 学生
学  校 西安电子科技大学
专  业 软件工程

  自我简介:

解题思路:

为什莫这么做就不多说了,前面的大佬们已经解释过了;这里来说说具体是怎么的到东东每次所报的数(因为我觉得前面大佬说的不算清楚):

例如:n=3,k=13,T=3的时候对应的表如下(带颜色的是东东报的数)

0123456789
124711393117

东东所报的数用  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; 
 }     //史上最难优化的超时代码
2023-11-06 20:04:50
#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;
}//显示运行时错误,可能是数组下标越界引起的,可不知道哪里有问题
2023-02-04 18:39:08
请哪个大佬给我看看我这,我输的每个数结果都能对上,就是不对时为啥啊
#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;
}
2022-08-19 20:34:37
#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
2022-03-29 21:02:23
#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ㄒ)/~~
2022-02-07 21:34:19
为什么要%k啊
2022-01-07 15:51:56
#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,有大佬知道什么问题吗
2021-10-17 20:29:54
真的是神仙
2021-04-17 11:41:28