P5686 [CSP-SJX2019]和積和
阿新 • • 發佈:2020-09-21
非常簡單的一道題,此部落格的意義在於一個細節
(簡單的式子推導略過)
程式碼
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<cstdlib> #include<ctime> using namespace std; typedef long long ll; const ll mod=1000000007; int n; ll ans,a[500005],b[500005],suma[500005],sumb[500005],sumc[500005],sumaa[500005],sumbb[500005]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); a[i]%=mod; suma[i]=(suma[i-1]+a[i])%mod; sumaa[i]=(sumaa[i-1]+suma[i])%mod; } for(int i=1;i<=n;i++){ scanf("%lld",&b[i]); b[i]%=mod; sumb[i]=(sumb[i-1]+b[i])%mod; sumbb[i]=(sumbb[i-1]+sumb[i])%mod; sumc[i]=(sumc[i-1]+(suma[i]*sumb[i])%mod)%mod; } for(int r=1;r<=n;r++){ ll sum1=(((suma[r]*sumb[r])%mod)*r)%mod;//這一行我除錯了一萬年,最終發現是三個數乘起來炸裂了,也告訴我每一步運算都要模一次,不然就會出鍋,而且非常難發現這種失誤 ll sum2=(sumaa[r-1]*sumb[r])%mod; ll sum3=(sumbb[r-1]*suma[r])%mod; ans=(ans+((sum1-sum2+mod)%mod-sum3+sumc[r-1]+mod)%mod)%mod; } printf("%lld\n",ans); return 0; }