日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AT1278 Counting on a Triangle 题解

發布時間:2023/12/29 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AT1278 Counting on a Triangle 题解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意

一個第 nnn 行有 nnn 個點的矩陣,其規律為每個點的值為每個點橫坐標與縱坐標的乘積,求第 AAA 行到第 BBB 行所有點的值的和(包括 AAABBB 兩行),結果 mod1000000007\mod1000000007mod1000000007

暴力做法

枚舉每個數并累加取模即可,顯然,復雜度 Θ(n2)\Theta(n^2)Θ(n2) 的暴力會 TLE,因為數據范圍是 10610^6106

優化

仔細觀察這個矩陣,我們可以一行一行考慮,

對于第 nnn 行,每個點的坐標分別為 (1,n),(2,n),(3,n)?(n?1,n),(n,n)(1,n),(2,n),(3,n)\cdots(n-1,n),(n,n)(1,n),(2,n),(3,n)?(n?1,n),(n,n)

這些點的值的和為 n+2n+3n+?+(n?1)n+n2n + 2n + 3n + \cdots + (n-1)n + n^2n+2n+3n+?+(n?1)n+n2

提取公因數后得 n(1+2+3+?+n?1+n)n(1 + 2 + 3 + \cdots + n-1 + n)n(1+2+3+?+n?1+n)

因此問題就轉化為了求這個等差數列的和。

運用我們數學課的知識,對一個等差數列求和,其公式為 n(n+1)2\frac{n(n+1)}{2}2n(n+1)?

再回到暴力解法,原來的第二層循環就可以替換為等差數列求和,這時就只有一重循環了,時間復雜度 Θ(n)\Theta(n)Θ(n)

代碼

分析之后代碼就很好寫了,注意取模,雖然答案再 int 范圍內,但是在計算過程中可能會超出 int 范圍,所以開 long long 會更保險。

#include<bits/stdc++.h> using namespace std; #define ll long long const int mod = 1000000007; ll a, b, ans; int main() {scanf("%lld%lld", &a, &b);for(ll i = a; i <= b; i++) {ans += (i * (i * (i + 1) / 2) % mod) % mod;ans %= mod;}printf("%lld\n", ans);return 0; }

總結

以上是生活随笔為你收集整理的AT1278 Counting on a Triangle 题解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。