【发布时间】:2014-10-26 09:33:31
【问题描述】:
数列的第 n 项是 f(n)。
f(n) = 1, when n=1
f(n)= ((n-1)*(8*(n–2)* 2+ 20)+4) , when n>1
P(n)=f(1)+f(2)+.....f(n)
1<=n<=10^9
对于给定的 n,我们必须找到 P(n) 模 10^9+7。
我解了方程,最后得到的答案是 P(n)=(16n^3-18n^2+14n-12)/3
当我用 c++ 实现它时,问题就来了。
下面的代码告诉我它有什么问题以及如何解决它?
#include<stdio.h>
#define c 1000000007
int main()
{
long long int t,n,sum;
scanf("%lld",&t);
while(t--)
{
sum=0;
scanf("%lld",&n);
if(n==1)
printf("1\n");
else
{
sum=(((16*(((((n%c)*(n%c))%c)*(n%c))%c)%c)+14*(n%c))%c-(18*(((n%c)*(n%c))%c)%c+12)%c)/3;
sum++;
printf("%lld\n",sum);
}
}
return 0;
}
【问题讨论】:
-
如果您更改包含和命名空间,这是 C,而不是 C++。这样的组合会在这里得到反对,你应该改变它。如果你已经有一个简单的方程,为什么不使用它呢?而不是那么多模数的东西......
-
我看不到你程序中所有部分的总和......但是你在那里做什么?两个scanf'ed变量是第一个奇怪的事情。 (现在编辑无济于事,因为显然你不知道自己在做什么)
-
n 的值最大为 10^9 会导致溢出。
-
不,不会。你为什么这么认为?
-
n 立方体将是 10^27,对于 n=10^9。并且在 64 位中它不会变得合适。
标签: c overflow modulo polynomial-math