QAQ 这么简单的一道题。。。。我个傻蛋
题意是给你一串数列,叫你求所有子串的和。题目涉及线段是,但是跟线段树半点关系都没有啊喂。
就统计每个数在子串中出现的次数就好,我是有点懒,直接先模拟找规律,然后套进去的。刚开始一直WA,后来发现是数组范围开大了,改完之后就A了= =
然后取模很重要啊,每次都要小心会不会暴啊
#include <stdio.h> #include <iostream> #include <string.h> using namespace std; #define maxn 447010 #define mod 1000000007 #define ll __int64 ll num[maxn]; int main() { int T; //freopen("ex.txt","r",stdin); cin>>T; while(T--) { ll n; cin>>n; ll sum=0; ll i,j,k; for(i=1;i<=n;i++) scanf("%I64d",&num[i]); if(n==1) {printf("%I64d\n",num[1]);continue;} //sum+=num[1]*n+num[n]*n; if(sum>=mod) sum%=mod; for(i=n,j=1;i>=1;i--,j++) { sum+=((i*j)%mod*(num[j]))%mod; ///注意这里取模处理,刚刚把(i*j)后面的mod去掉了就WA了 if(sum>=mod) sum%=mod; //printf("%d\n",i*j); } printf("%I64d\n",sum); } return 0; }