C 如何计算给定级数的和

C 如何计算给定级数的和,c,overflow,modulo,polynomial-math,C,Overflow,Modulo,Polynomial Math,序列的第n项是fn 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,我们必须找到模为10^9+7的Pn 我解了这个方程,最后得到了答案 Pn=16n^3-18n^2+14n-12/3 问题是在C++中实现的。 下面给出的代码告诉我它有什么问题以及如何解决 #inclu

序列的第n项是fn

      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,我们必须找到模为10^9+7的Pn

我解了这个方程,最后得到了答案 Pn=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;
}

代码中存在多个问题

问题1: 像long long b=a%c*a%c%c;a和b是长的 而c只是一个普通的数字,即int,仍然受到int溢出的影响,没有 使用long-long的全部功能。原因是模的结果:

long long = ((long long % int) * (long long % int)) % int;
long long = (int * int) % int;
long long = int % int; //overflow here
long long = int;
long long = long long; //expanding too late
//finished
作为检查的示例:

没问题: n=1不需要特别检查,因为
整个计算将导致1个方面。

如果你改变了包含和命名空间,这是C,而不是C++。这样的组合会在这里获得否决票,你应该改变它。如果你已经有了一个简单的方程式,为什么不使用它呢?而不是那些模的东西…我看不到你的程序中所有部分的总和。。。但是你在那里做什么呢?两个扫描变量是第一件奇怪的事情。现在编辑不会有帮助,因为显然你不知道你在做什么。n的值可能高达10^9,这将导致溢出。不,不会。你为什么这么认为?n=10^9时,n立方体将是10^27。而且在64位中,它不会变得合适。
#include <iostream>
using namespace std;

int main() {
    int i = 1000000;
    long long ll = 1000000;
    cout<< ((999999%i)*(999999%i)*(999999%i)) << endl;
    cout<< ((999999%ll)*(999999%ll)*(999999%ll)) << endl;
    return 0;
}
#include<stdio.h>
int main()
{
    signed long long n, res, c;
    n = 2456ULL;
    c = 1000000007ULL;
    signed long long part1 = (16*(((n%c)*(n%c)%c)*(n%c)%c))%c;
    signed long long part2 = (18*((n%c)*(n%c)%c))%c;
    signed long long part3 = (14*(n%c))%c;
    res = ((part1 - part2 + part3 - 12)%c)/3 + 1;
    printf("%lld\n", res);
    return 0;
}