博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 5514 容斥原理
阅读量:5076 次
发布时间:2019-06-12

本文共 1479 字,大约阅读时间需要 4 分钟。

题意: 有 n 只青蛙,一开始都在 0 点。有一堆围成一圈的石子,石子的编号是从 0 ~ (m-1)。 所有青蛙只能顺时针跳,每个青蛙可以一次跳a[i]格。问这些青蛙踩过的石子的编号总和是多少?

tags:  容斥经典题。

对 m 分解因子,对每个因子求贡献。

#include
using namespace std;#pragma comment(linker, "/STACK:102400000,102400000")#define rep(i,a,b) for (int i=a; i<=b; ++i)#define per(i,b,a) for (int i=b; i>=a; --i)#define mes(a,b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define MP make_pair#define PB push_back#define fi first#define se secondtypedef long long ll;const int N = 200005;int T, n, m, pp[N], f[N], cnt;ll ans;void get_pp(int mn){ cnt=0; for(int i=1; i<=sqrt(mn); ++i) if(mn%i==0) { pp[++cnt]=i; if(mn/i != i) pp[++cnt]=mn/i; } sort(pp+1, pp+1+cnt); --cnt;}void Init(){ mes(f, 0); ans = 0;}int main(){ scanf("%d", &T); rep(cas, 1, T) { scanf("%d%d", &n, &m); Init(); get_pp(m); int ai, tmp; rep(i,1,n) { scanf("%d", &ai); tmp = __gcd(ai, m); rep(j,1,cnt) if(pp[j]%tmp==0) f[j] = 1; } ll tmp1; rep(i,1,cnt) if(f[i]) { tmp1 = (m-1)/pp[i]; ans += tmp1*(tmp1+1)/2 * pp[i] * f[i]; rep(j,i+1,cnt) if(pp[j]%pp[i]==0) f[j] -= f[i]; } printf("Case #%d: %lld\n", cas, ans); } return 0;}

转载于:https://www.cnblogs.com/sbfhy/p/7800821.html

你可能感兴趣的文章
linux生成多对秘钥并指定秘钥登录
查看>>
English Study Plan
查看>>
C#对注册表的操作
查看>>
大小不确定图片垂直居中
查看>>
CRC校验3种算法_转载
查看>>
回调--一个经典例子让你彻彻底底理解java回调机制
查看>>
React-redux及异步获取数据20分钟快速入门
查看>>
Node.js安装及环境配置之Windows篇
查看>>
Locust压力测试使用总结
查看>>
九度OJ 1146:Flipping Pancake(翻饼子) (递归、游戏)
查看>>
历届试题 大臣的旅费
查看>>
优化SQL查询:如何写出高性能SQL语句
查看>>
迭代器-Iterator
查看>>
开学收好这 17 种工具 App,让你新学期学习更有效率
查看>>
html设定快捷键
查看>>
基于HTML5 audio元素播放声音jQuery小插件
查看>>
background-origin 设置背景图片原始起始位置
查看>>
Navicat 在MySQL中建表查询scott实例之员工表dbo_emp
查看>>
POJ - 1850 B - Code
查看>>
oracle Linux 7.4 oracle-database-preinstall-18c
查看>>