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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu5514Frogs

發(fā)布時間:2023/12/8 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu5514Frogs 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=5514

題意:給定n,m,有n只青蛙,m塊編號0~m-1的圍成環(huán)石頭。初始時所有青蛙都在第0塊石頭上,然后給定n個整數(shù)表示n只青蛙每次跳的固定長度,青蛙一直繞環(huán)跳,求最后被跳過的石頭的編號之和,同一塊石頭不多次計算。

分析:一看到這個題的時候就想到容斥,以為很容易看到會有多只青蛙跳到同一塊石頭上。首先我們能想到每只青蛙跳的長度a與總長度m的關(guān)系可以確定青蛙在環(huán)上跳的“最小長度”為gcd(a,m)。然后有多個最小公約數(shù)我們要怎么計算和去重呢?如果只是按普通的容斥去加加減減的話復(fù)雜度是O(2^n),并不可取,然后我們觀察可以發(fā)現(xiàn)每一個gcd都是m的因子,并且!gcd與gcd之間的最小公倍數(shù)(即容斥的地方)要么<=m也會是m的一個因子或者>m就不用容斥啦。那么題目就變得簡單啦,我們只要計算每一個m的因子所需要做的貢獻,多做了就減少做了就加咯,時間復(fù)雜度的話看到別人分析說m的因子個數(shù)不會超過logm那么時間復(fù)雜度就是O(logm*logm+n*logm)了。

代碼:

#include<map> #include<set> #include<cmath> #include<queue> #include<math.h> #include<cstdio> #include<vector> #include<string> #include<cstring> #include<iostream> #include<algorithm> #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; const int N=100010; const int MAX=151; const int MOD=1000000007; const int MOD1=100000007; const int MOD2=100000009; const int INF=1000000000; const double EPS=0.00000001; typedef long long ll; typedef unsigned long long uI64; int read() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f; } int gcd(int a,int b) {if (b) return gcd(b,a%b);return a; } int b[N],q[N],num[N]; int main() {int i,j,k,n,m,t,x;ll ans;scanf("%d", &t);for (int ca=1;ca<=t;ca++) {scanf("%d%d", &n, &m);k=0;for (i=1;i*i<=m;i++)if (m%i==0) {b[++k]=i;if (i*i!=m) { b[++k]=m/i; }}sort(b+1,b+k+1);k--;memset(q,0,sizeof(q));for (i=1;i<=n;i++) {scanf("%d", &x);x=gcd(m,x);for (j=1;j<=k;j++)if (b[j]%x==0) q[j]=1;}ans=0;memset(num,0,sizeof(num));for (i=1;i<=k;i++) {if (q[i]!=num[i]) {int w=(m-1)/b[i];ans-=(ll)w*(w+1)/2*b[i]*(q[i]-num[i]);w=q[i]-num[i];for (j=i;j<=k;j++)if (b[j]%b[i]==0) num[j]+=w;}}printf("Case #%d: %lld\n", ca, ans);}return 0; }/* 10 2 12 9 10 3 60 22 33 66 9 96 81 40 48 32 64 16 96 42 72 10 1000000189 1 2 3 5 7 13 17 19 23 29*/

總結(jié)

以上是生活随笔為你收集整理的hdu5514Frogs的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。