《数字游戏》问题求解

Quesiter 2014-05-23 03:22:36
问题描述
  栋栋正在和同学们玩一个数字游戏。

  游戏的规则是这样的:栋栋和同学们一共n个人围坐在一圈。栋栋首先说出数字1。接下来,坐在栋栋左手边的同学要说下一个数字2。再下面的一个同学要从上一个同学说的数字往下数两个数说出来,也就是说4。下一个同学要往下数三个数,说7。依次类推。

  为了使数字不至于太大,栋栋和同学们约定,当在心中数到 k-1 时,下一个数字从0开始数。例如,当k=13时,栋栋和同学们报出的前几个数依次为:
  1, 2, 4, 7, 11, 3, 9, 3, 11, 7。

  游戏进行了一会儿,栋栋想知道,到目前为止,他所有说出的数字的总和是多少。
输入格式
  输入的第一行包含三个整数 n,k,T,其中 n 和 k 的意义如上面所述,T 表示到目前为止栋栋一共说出的数字个数。
输出格式
  输出一行,包含一个整数,表示栋栋说出所有数的和。
样例输入
3 13 3
样例输出
17
样例说明
  栋栋说出的数依次为1, 7, 9,和为17。
数据规模和约定
  1 < n,k,T < 1,000,000;

#include<stdio.h>
int main()
{
long long n,k,t,i,total=1,op=1,cishu=1;
scanf("%I64d%I64d%I64d",&n,&k,&t);
for(i=1;i<t;i++)
{ long long op1=((n*i+1+n*(i-1))*n/2)%k;
op+=op1;
op%=k;
total+=op;
}
printf("%I64d\n",total);
return 0;
}


以上是标准答案,没有读懂思路,求解释。
以下是鄙人代码,运行超时,求改进。
#include<stdio.h>
#include<conio.h>

int main()
{
long long n=0,k=0,t=0;
long long num=1,count=0;
scanf("%I64d%I64d%I64d",&n,&k,&t);
int i;
long long a[10000];
a[1]=1;
for(i=1;i<=n*t;i++)
{
num+=i;
a[i+1]=(num%k);
}
for(i=1;i<=n*t;i++)
{
if(i%n==1)
{
count+=a[i];
}
}
printf("%d",count);
return 0;
}
...全文
166 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Falleyes 2014-05-25
  • 打赏
  • 举报
回复
标准答案的时间规模是t,而你的程序规模是2*n*t。很明显,当n和t都很大的时候,标准答案时间复杂度O(n),你的答案时间复杂度O(n^2)。 不论多少个人的报数,你只用考虑这个栋栋!人数大小只是改变栋栋报的每两个数之间的差值。如果是1个人,那么栋栋第一次和第二次报数差1,如果两个人,差3,如果三个人,差6,以此类推。把这个差值把握好,就可以得出op1的公式了,然后剩下的操作都很简单,最后把total输出。 而且程序完全不用数组来存储栋栋报的数字,因为最后只求和,所以不用浪费内存。
Quesiter 2014-05-24
  • 打赏
  • 举报
回复
没有人回复呢。。求帮助。。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧