hdu5514Frogs(容斥原理)
来源:互联网 发布:平安银行淘宝卡怎么样 编辑:程序博客网 时间:2024/05/16 10:57
显然,第 i 只青蛙能跳过的石头的 id = k*gcd(a[i],m)。所以题目就是相当于求 0 ~ m - 1 这些数中至少是一个 a[i] (a[i]|m) 的倍数。
0 ~ m - 1 这些数中是 d (d|m) 的倍数的和为
d * m/d * (m/d - 1) / 2 。
但是,这样计算必然会重复。
先把 m 的因数求出来,最多不多于300个,再把是 a[i] 倍数的因数标记(我们要保证它们只算一遍!!!)。从小枚举 m 的因数,把 m 未枚举到的因数中多算的记到 num[j] 里面去,这样计算的时候改为
d * m/d * (m/d - 1) / 2 * (vis[j]-num[j]) 就能得到正确答案。
#include <iostream>#include <cstdio>#include <algorithm>#include <cstdlib>#include <stack>#include <vector>#include <cstring>#include <queue>#define msc(X) memset(X,-1,sizeof(X))#define ms(X) memset(X,0,sizeof(X))typedef long long LL;using namespace std;const int maxn=1e4+5;int vis[maxn],num[maxn],fac[maxn],cnt;int gcd(int a,int b){return b?gcd(b,a%b):a;} int main(int argc, char const *argv[]){ int t,ti=0; scanf("%d",&t); while(++ti<=t) { int n,m;LL ans=0; scanf("%d%d",&n,&m); cnt=0; ms(vis); ms(num); for(int i=1;(LL)i*i<=m;i++) if(m%i==0) { fac[cnt++]=i; if(i*i<m) fac[cnt++]=m/i; } sort(fac,fac+cnt); --cnt; for(int i=0;i<n;i++) { int x; scanf("%d",&x); x=gcd(x,m); for(int j=0;j<cnt;j++) if(fac[j]%x==0) vis[j]=1; } for(int i=0;i<cnt;i++) if(vis[i]&&vis[i]!=num[i]) { ans+=(LL)fac[i]*(m/fac[i])*(m/fac[i]-1)/2*(vis[i]-num[i]); for(int j=i+1;j<cnt;j++) if(fac[j]%fac[i]==0) num[j]+=vis[i]-num[i]; } printf("Case #%d: %lld\n",ti,ans ); } return 0;}
0 0
- hdu5514Frogs(容斥原理)
- hdu5514Frogs 容斥
- hdu5514Frogs+容斥
- HDU5514Frogs 【容斥定理】
- hdu5514Frogs(容斥,好题)
- hdu5514Frogs
- hdu1695 (容斥原理)
- hdu1695 (容斥原理)
- UESTC1720(容斥原理)
- 容斥原理(转载)
- hdu1796(容斥原理)
- 容斥原理(SOJ3082)
- HDU1695(容斥原理)
- hdu4135(容斥原理)
- hdu1796(容斥原理)
- HDU5120 (容斥原理)
- 容斥原理(模板)
- 集合论(容斥原理)
- 递推算法
- VM下安装linux 总是黑屏的问题
- 机器学习3-什么是好的特征
- osx在命令行中运行不了cmake命令
- 蓝桥杯 - 算法训练 最短路 Bellman-Ford算法 C语言实现
- hdu5514Frogs(容斥原理)
- [LeetCode]413. Arithmetic Slices 解题报告
- Raspberry Pi 树莓派
- 从文件中读取数据,排序之后输出到另一个文件中
- 用户管理
- 学生酒精消费预警分类模型建立
- 洛谷 P1064 金明的预算方案
- Java语言基础 数组的排序算法
- 动态规划 HDU-2577