HDU-5514 Frogs 容斥原理+技巧
阿新 • • 發佈:2018-11-01
暴力的話肯定會超時,所以需要運用容斥原理,首先把m的因子全部存入一個數組,然後再在這個基礎上進行容斥和等差數列求和。
AC程式碼:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <queue> #include <stack> #include <vector> #include <map> #include <cmath> using namespace std; long long t,n,m,i,j,o,a; long long p[100000],q[100000]; long long gcd(long long a,long long b) { return b?gcd(b,a%b):a; } int main() { scanf("%lld",&t); for(o=1;o<=t;o++) { scanf("%lld%lld",&n,&m); memset(p,0,sizeof(p)); long long cnt=0; q[cnt++]=1; for(i=2;i*i<=m;i++) { if(m%i==0) { if(i*i==m) { q[cnt++]=i; } else { q[cnt++]=i; q[cnt++]=m/i; } } } sort(q,q+cnt); for(i=0;i<n;i++) { scanf("%lld",&a); a=gcd(a,m); for(j=0;j<cnt;j++) { if(q[j]%a==0) p[j]=1; } } long long sum=0; for(i=0;i<cnt;i++) { if(p[i]!=0) { long long h=(m-1)/q[i]; sum+=h*(h+1)/2*q[i]*p[i];//等差數列求和公式 for(j=i+1;j<cnt;j++) { if(q[j]%q[i]==0) { p[j]-=p[i]; } } } } printf("Case #%lld: %lld\n",o,sum); } return 0; }