hdu--2576--高中數學..


這題 絕逼是以前高中學到數列的時候做的難題...

就是忘記了 我一開始就直接開了個數組做 導致了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 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM