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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

清北学堂模拟赛d3t2 b

發布時間:2025/3/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 清北学堂模拟赛d3t2 b 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

分析:一道比較讓人頭疼的數學題.

? ? ?先考慮怎么讓分出來的三角形相似,先不考慮每個三角形的具體邊長,設每個三角形的周長為li,則可知必然有一個數g = gcd{li},每一個三角形的周長都是g的倍數,這樣就會有n/g個單位三角形,我們只需要把n/g分配給若干個三角形就可以了,利用隔板法,可以算出方案數為2^(n/g - 1).

? ? ?再來考慮知道了周長怎么求這個周長的三角形有多少個.為了方便起見,設a ≤ b ≤ c,s = a + b + c,如果b = c,那么s = a + 2b,b的取值范圍就是[g/3上取整,(g-1)/2下取整],看看取值范圍內有多少個整數就有多少種方案.如果b < c,那么可以把c--,直到變成b=c,那么就是f[i] = f[i - 1],但是這樣有一種特殊情況:a + b = c,這在f[i - 1]中是合法的,但是我們在處理的時候要減掉這種方案.s = 2c,c = g/2,顯然只有g是偶數的時候才會出現這種情況,這時a和b只能取g/4個數,方案數減去g/4就可以了.

? ? ?但是這樣還是不行,如果一個三角形邊長是2,2,3,另外一個是4,4,6,那么可以將前面一個三角形作為單位三角形分配給后面的三角形,直接計算會將一個方案算多次,所以我們要求的f[s],s = a + b + c中的a,b,c必須是互質的,為了去重,每一個f[s] -= f[k],k | s.就可以了.

#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath>using namespace std;const int mod = 1e9 + 7;typedef long long ll; ll n, f[1000010], p[1000010], cnt, mi[1000010], ans;void add(ll &a, ll b) {a += b;if (a >= mod)a -= mod; }int main() {scanf("%lld", &n);for (ll i = 3; i <= n; i++){f[i] = f[i - 1];add(f[i], (i - 1) / 2 - ceil((double)i * 1.0 / 3) + 1);if (!(i & 1))f[i] -= i / 4;}for (ll i = 1; i * i <= n; i++)if (n % i == 0){if (i * i != n){p[++cnt] = i;p[++cnt] = n / i;}elsep[++cnt] = i;}sort(p + 1, p + 1 + cnt);for (ll i = 1; i <= cnt; i++)for (ll j = 1; j < i; j++)if (p[i] % p[j] == 0)add(f[p[i]], mod - f[p[j]]);mi[0] = 1;for (ll i = 1; i <= n; i++){mi[i] = mi[i - 1];add(mi[i], mi[i - 1]);}for (ll i = 1; i <= cnt; i++)add(ans, mi[n / p[i] - 1] * f[p[i]] % mod);printf("%lld\n", ans);return 0; }

?

轉載于:https://www.cnblogs.com/zbtrs/p/7650595.html

總結

以上是生活随笔為你收集整理的清北学堂模拟赛d3t2 b的全部內容,希望文章能夠幫你解決所遇到的問題。

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