這題 絕逼是以前高中學到數列的時候做的難題...
就是忘記了 我一開始就直接開了個數組做 導致了mle 然后就覺得應該是去找數學公式了
這題的 數學推導過程很復雜的... 我直接寫紙上了
設Tn = 1 + (1+2) + (1+2+3) + .....(1+2+3+...n)
所以
發現 效果很差啊...<不會拍照>
我還是直接手寫吧...
接下去的重點就是 化簡 1^2+2^2+3^2+....n^2
其實它就是等於 (1+2+3+....n)+(2+3+...n)+(3+....n)+....n 不難理解 就是將上面的平方全部拆開來 x^2 x為幾 就會出現幾次
然后這就可以運用 等差數列求和
化簡為:[(n+1)n+(n+2)(n-1)+(n+3)(n-2)+....(n+n)(n-(n-1))]/2這邊 不要直接寫成(2n)*1 這樣對下面的分解有很大影響
我在下面的式子都省略了/2因為寫起來太不方便了 就在最后化簡的時候出現 這邊注明下
然后 我們把它給乘開來 即
(n^2+n-0)+(n^2+n-2)+(n^2+n-6)+....(n^2+n-(n-1)*n)--一共有n項
然后 仔細觀察 會發現 0 = 0*1 2 = 1*2 6 = 2*3 12 = 3*4 ..... 最后一項:(n-1)*n
然后這n項中都有n^2和n 所以可以化簡求得
x = n^3 + n^2 -(2+6+12+...+(n-1)*n) 至於后面的話 就可以化簡為上2行提過的 我們先將它從式子中拿出來
z = 2+6+....+(n-1)*n= 1*2+2*3+....(n-1)*n=1*(1+1)+2*(2+1)+3*(3+1)+....(n-1)*(n-1+1) = 1^2+2^2+3^2+...(n-1)^2+(1+2+3+...n-1)
至於z中的1^2+2^2+3^2+...(n-1)^2就是Sn-1 因為我們將Sn看成1^2+2^2+3^2+...n^2
所以可以將x這個式子化簡為 n^3+n^2-Sn-1-n(n-1)/2=Sn*2
即3Sn=n^3+n^2-n(n-1)/2這里還可以就是簡單的化簡下 我這邊不寫了
最終可以得到Sn=1^2+2^2+3^2+.....+n^2=n(n+1)(2n+1)/6
然后在將Sn+n(n+1)/2
最終得到了Tn = 1*2+2*3+3*4+(n-1)*n = n(n+1)(n+2)/3
因為這題的話 本來就預先/2所以最終 ans[n] = n(n+1)(n+2)/6
因為mod = 20090524; mod^2是在long long范圍內 mod^3就超出了long lnog 的范圍
所以 需要將它分布來乘
同時n(n+1)肯定能整除2 (n+1)(n+2)當然也滿足肯定能整除2 習慣上 我們還是選擇第一個
然后 要注意的是n(n+1)/2%(mod*3)這邊要mod*3因為要保證得到的ans可以整除3 因為我們已經是先確定了n(n+1)(n+2)可以整除6
為什么*3就可以保證了呢?
x%(mod*y)=ans 那么ans = k*y 這樣就解釋了ans為什么可以整除y

1 #include <iostream> 2 using namespace std; 3 4 typedef long long LL; 5 const LL mod = 20090524; 6 7 int main() 8 { 9 int t; 10 LL n , ans; 11 cin >> t; 12 while( t-- ) 13 { 14 cin >> n; 15 ans = n*(n+1)/2%(mod*3); 16 ans = ans*(n+2)/3%mod; 17 cout << ans << endl; 18 } 19 return 0; 20 }