hdu5514-Frogs(容斥原理)好题
题意:有m个石头围成一圈,编号分别为0到m-1,现在有n只青蛙,都在0号石头上,第i只青蛙会从当前编号为p的石头跳到编号为(p+ai)%m的石头上。被青蛙经过的石头都会被占领,求这m块石头中所有被占领过的石头的编号和。
题解:对于第i只青蛙,它所能跳到的最小的位置是gcd(ai, m)
设最小位置为z,需要跳x圈,跳了y步,可得方程:x*m+z=ai*y
即:x*m-ai*y = z 由扩展欧几里得定理可知,z的最小整数解为gcd(m,ai)
因为对于单独的每一只青蛙计算结果会重复计算,所以利用容斥对每一个m的因子计算。
首先对于每一个x=gcd(ai,m),如果m的一个因数fac%x==0,那么fac就会被跳到。
然后对于每一个会碰到的因数计算,当m的一个因数j的因数i被计算的时候,j就会被重复计算,要减去。
虽然题解很有道理,但是我想了好久也没明白容斥不是奇加偶减吗,怎么这么算了= =
后来搜题解明白了此题gcd太多,二进制枚举会爆longlong,dfs也会超时,http://www.acmtime.com/?p=864 一个神奇的剪枝。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath> using namespace std; const int N = ;
int fac[N], cnt;
int cc[N]; void cal(int x) {
cnt = ;
int limit = sqrt(x);
fac[cnt++] = ;
for (int i = ; i < limit; ++i) {
if (x % i == ) fac[cnt++] = i, fac[cnt++] = x/i;
}
if (limit*limit == x) fac[cnt++] = limit;
else if (x % limit == ) fac[cnt++] = limit, fac[cnt++] = x/limit;
sort(fac, fac+cnt);
} int main()
{
int T, cas = ;
int n, m;
scanf("%d", &T);
while (T--) {
printf("Case #%d: ", ++cas);
scanf("%d%d", &n, &m); //1e4 1e9
cal(m);
memset(cc, , sizeof cc);
int ai;
for (int i = ; i < n; ++i) {
scanf("%d", &ai);
int gcd = __gcd(ai, m);
for (int i = ; i < cnt; ++i) {
if (fac[i] % gcd == ) cc[i] = ;
}
}
long long ans = ;
for (int i = ; i < cnt; ++i) {
if (cc[i] == ) continue;
long long tmp = (m-) / fac[i];
ans += tmp * (tmp+) / * fac[i] * cc[i];
for (int j = i+; j < cnt; ++j) {
if (fac[j] % fac[i] == ) cc[j] -= cc[i];
}
}
printf("%lld\n", ans);
}
return ;
}
hdu5514-Frogs(容斥原理)好题的更多相关文章
- HDU5514 Frogs
/* HDU5514 Frogs http://acm.hdu.edu.cn/showproblem.php?pid=5514 容斥原理 * * */ #include <cstdio> ...
- 【做题】hdu5514 Frogs——另类容斥
题意是给出n个m的约数,问[0,m-1]中至少被其中一个约数整除的整数和.(n<=10000,m<=1000000000) 直接容斥的话,是2^n再拖个log的复杂度,加上当前的数大于m时 ...
- hdu4135Co-prime 容斥原理水题
//问一个区间[a,b]与n互素的数的个数 //利用容斥原理可知 //在[a,b] 区间内对n的素数因子 //ans = 被一个数整除的数的个数 - 被两个数的最小公倍数整除的数的个数 + 被三个数的 ...
- 从HDU2588:GCD 到 HDU5514:Frogs (欧拉公式)
The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes written (a,b),is the ...
- HDU 5514 Frogs (容斥原理+因子分解)
题目链接 题意:有n只青蛙,m个石头(围成圆圈).第i只青蛙每次只能条ai个石头,问最后所有青蛙跳过的石头的下标总和是多少? 题解:暴力肯定会超时,首先分解出m的因子,自己本身不用分,因为石头编号是0 ...
- HDU 5514 Frogs (容斥原理)
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=5514 题意 : 有m个石子围成一圈, 有n只青蛙从跳石子, 都从0号石子开始, 每只能越过a[i] ...
- hdu 6021 MG loves string (一道容斥原理神题)(转)
MG loves string Accepts: 30 Submissions: 67 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- hdu 4235 容斥原理模板题
题目大意: 输入样例个数T,每个样例输入三个数a,b,n,求[a,b]之间与n互素的个数 基本思路: 互斥,想想这个:AUBUC=A+B+C-A∩B-A∩C-B∩C+A∩B∩C fac存的是n的素因数 ...
- poj 2773(容斥原理)
容斥原理入门题吧. Happy 2006 Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 9798 Accepted: 3 ...
- 【BZOJ2005】【NOI2010】能量采集(莫比乌斯反演,容斥原理)
[BZOJ2005][NOI2010]能量采集(莫比乌斯反演,容斥原理) 题面 Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量 ...
随机推荐
- AIX 内存使用情况
cat > WHAT_EVER_YOU_WANT.sh#!/usr/bin/ksh#memory calculatorum=`svmon -G | head -2|tail -1| awk {' ...
- [HIHO1143]骨牌覆盖问题·一(矩阵快速幂,递推)
题目链接:http://hihocoder.com/problemset/problem/1143 这个递推还是很经典的,结果是斐波那契数列.f(i) = f(i-1) + f(i-2).数据范围太大 ...
- Ubuntu 安装vsftp软件(已测试)
首先开启Ftp端口 使用apt-get命令安装vsftp #apt-get install vsftpd -y 添加ftp帐号和目录 先检查一下nologin的位置,通常在/usr/sbin/nolo ...
- Java生成可执行文件 & MANIFEST.MF问题 METAINFO
用 Intellij 进行打包.在File -> Project Structure里面. 然后应该会自动生成Jar包(也可以Build->Build Artifacts) xxx.jar ...
- UVALive 3415 Guardian of Decency(二分图的最大独立集)
题意:老师在选择一些学生做活动时,为避免学生发生暧昧关系,就提出了四个要求.在他眼中,只要任意两个人符合这四个要求之一,就不可能发生暧昧.现在给出n个学生关于这四个要求的信息,求老师可以挑选出的最大学 ...
- python - 简明 性能测试
简洁测试: # python -m cProfile test.py 代码注入: # -*- coding: utf-8 -*- class test(object): pass class test ...
- (六)6.17 Neurons Networks convolutional neural network(cnn)
之前所讲的图像处理都是小 patchs ,比如28*28或者36*36之类,考虑如下情形,对于一副1000*1000的图像,即106,当隐层也有106节点时,那么W(1)的数量将达到1012级别,为了 ...
- AIX 第6章 指令记录
AIX 存储管理 物理卷的概念和管理 卷组的概念和管理 逻辑卷的基本概念和管理 文件系统在逻辑卷上构建 日志文件系统的管理 镜像提高数据可用性 应用系统所需的存储切换 换页空间的功能和管理 在 ...
- 在ACCESS中创建数据库和查询(ACCESS 2000)
备份还原数据库 备份.还原 —— 复制\粘贴 压缩修复数据库命令 —— 复制该文件并重新组织,并重新组织文件在磁盘上的储存方式.压缩同时优化了Access数据库的性能.(工具——实用数据库工具或者工具 ...
- Android中弹出输入法界面不影响app界面布局
默认情况下,输入法弹出的时候,原来的view会被挤扁.有些应用不想被挤,它们可以接受被输入法view覆盖在上面.这时候需要在AndroidManifest.xml acitivty里面加上一句: an ...