hdu5514Frogs
生活随笔
收集整理的這篇文章主要介紹了
hdu5514Frogs
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=5514
題意:給定n,m,有n只青蛙,m塊編號(hào)0~m-1的圍成環(huán)石頭。初始時(shí)所有青蛙都在第0塊石頭上,然后給定n個(gè)整數(shù)表示n只青蛙每次跳的固定長度,青蛙一直繞環(huán)跳,求最后被跳過的石頭的編號(hào)之和,同一塊石頭不多次計(jì)算。
分析:一看到這個(gè)題的時(shí)候就想到容斥,以為很容易看到會(huì)有多只青蛙跳到同一塊石頭上。首先我們能想到每只青蛙跳的長度a與總長度m的關(guān)系可以確定青蛙在環(huán)上跳的“最小長度”為gcd(a,m)。然后有多個(gè)最小公約數(shù)我們要怎么計(jì)算和去重呢?如果只是按普通的容斥去加加減減的話復(fù)雜度是O(2^n),并不可取,然后我們觀察可以發(fā)現(xiàn)每一個(gè)gcd都是m的因子,并且!gcd與gcd之間的最小公倍數(shù)(即容斥的地方)要么<=m也會(huì)是m的一個(gè)因子或者>m就不用容斥啦。那么題目就變得簡(jiǎn)單啦,我們只要計(jì)算每一個(gè)m的因子所需要做的貢獻(xiàn),多做了就減少做了就加咯,時(shí)間復(fù)雜度的話看到別人分析說m的因子個(gè)數(shù)不會(huì)超過logm那么時(shí)間復(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FCPX插件:Stupid Raisin
- 下一篇: 车联网用到了哪些关键技术,未来的趋势是什