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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【BZOJ3518】点组计数 [欧拉函数]

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【BZOJ3518】点组计数 [欧拉函数] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點組計數

Time Limit: 20 Sec??Memory Limit: 128 MB
[Submit][Status][Discuss]

Description

??? 平面上擺放著一個n*m的點陣(下圖所示是一個3*4的點陣)。Curimit想知道有多少三點組(a,b,c)滿足以a,b,c三點共線。這里a,b,c是不同的3個點,其順序無關緊要。(即(a,b,c)和(b,c,a)被認為是相同的)。由于答案很大,故你只需要輸出答案對1,000,000,007的余數就可以了。

Input

  有且僅有一行,兩個用空格隔開的整數n和m。

Output

  有且僅有一行,一個整數,表示三點組的數目對1,000,000,007的余數。(1,000。000。007是質數)

Sample Input

  3 4

Sample Output

  2 0

HINT

  對于100%的數據,1< =N.m< =50000

Main idea

  給定一個點陣,問有多少組三點共線。

Solution

  其實我也不知道原式怎么來的,我可能只會推式子啊?QAQ

Code

1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<cstdio> 5 #include<cstring> 6 #include<cstdlib> 7 #include<cmath> 8 using namespace std; 9 typedef long long s64; 10 11 const int ONE = 50005; 12 const int MOD = 1000000007; 13 const int Ny6 = 166666668; 14 15 int T; 16 int n,m; 17 bool isp[ONE]; 18 int prime[ONE],p_num; 19 int phi[ONE]; 20 s64 Ans; 21 22 int get() 23 { 24 int res=1,Q=1; char c; 25 while( (c=getchar())<48 || c>57) 26 if(c=='-')Q=-1; 27 if(Q) res=c-48; 28 while((c=getchar())>=48 && c<=57) 29 res=res*10+c-48; 30 return res*Q; 31 } 32 33 void Getphi(int MaxN) 34 { 35 phi[1] = 1; 36 for(int i=2; i<=MaxN; i++) 37 { 38 if(!isp[i]) 39 prime[++p_num] = i, phi[i] = i - 1; 40 for(int j=1; j<=p_num, i*prime[j]<=MaxN; j++) 41 { 42 isp[i * prime[j]] = 1; 43 if(i % prime[j] == 0) 44 { 45 phi[i * prime[j]] = (s64)phi[i] * prime[j] % MOD; 46 break; 47 } 48 phi[i * prime[j]] = (s64)phi[i] * phi[prime[j]] % MOD; 49 } 50 } 51 } 52 53 s64 Get(int a,int b,int num) {return (s64)(a+b) * num / 2 %MOD; } 54 s64 Sum(int n,int m) {return ((s64)n*(n-1)/2%MOD) * ((s64)m*(m-1)/2%MOD) % MOD;} 55 56 int C(int n) 57 { 58 int res = (s64)n * (n-1) % MOD * (n-2) % MOD; 59 return (s64) res * Ny6 % MOD; 60 } 61 62 int main() 63 { 64 Getphi(ONE-1); 65 n=get(); m=get(); 66 if(n > m) swap(n,m); 67 for(int d=1; d<=n; d++) 68 { 69 Ans += phi[d] * Get(n-d,n-(n/d)*d,n/d) % MOD *Get(m-d,m-(m/d)*d,m/d) % MOD; 70 Ans %= MOD; 71 } 72 73 Ans = (Ans - Sum(n,m) + MOD) % MOD; 74 Ans = Ans*2%MOD + (s64)C(n)*m%MOD + (s64)C(m)*n%MOD; 75 Ans %= MOD; 76 77 printf("%lld",Ans); 78 } View Code

?

轉載于:https://www.cnblogs.com/BearChild/p/6679382.html

總結

以上是生活随笔為你收集整理的【BZOJ3518】点组计数 [欧拉函数]的全部內容,希望文章能夠幫你解決所遇到的問題。

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