hdu 5514 Frogs 容斥思想+gcd 银牌题
Frogs
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1509 Accepted Submission(s): 498
The stones are numbered from 0 to m−1 and the frogs are numbered from 1 to n. The i-th frog can jump over exactly ai stones in a single step, which means from stone j mod m to stone (j+ai) mod m (since all stones lie on a circle).
All frogs start their jump at stone 0, then each of them can jump as many steps as he wants. A frog will occupy a stone when he reach it, and he will keep jumping to occupy as much stones as possible. A stone is still considered ``occupied" after a frog jumped away.
They would like to know which stones can be occupied by at least one of them. Since there may be too many stones, the frogs only want to know the sum of those stones' identifiers.
meaning the total number of test cases.
For each test case, the first line contains two positive integer n and m - the number of frogs and stones respectively (1≤n≤104, 1≤m≤109).
The second line contains n integers a1,a2,⋯,an, where ai denotes step length of the i-th frog (1≤ai≤109).
2 12
9 10
3 60
22 33 66
9 96
81 40 48 32 64 16 96 42 72
Case #2: 1170
Case #3: 1872
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
#include <map>
#include <bitset>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set>
#define MM(a,b) memset(a,b,sizeof(a));
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
#define CT continue
#define SC scanf
const int N=2*1e5+10;
int factor[N],num[N],appear[N],step[N];
ll add[N]; int gcd(int a,int b)
{
if(b==0) return a;
else return gcd(b,a%b);
} int main()
{
int cas,n,m,kk=0;
SC("%d",&cas);
while(cas--){
SC("%d%d",&n,&m);
int cnt=0;MM(num,0);MM(appear,0);
for(int i=1;i<=n;i++) SC("%d",&step[i]);
for(int i=1;i*i<=m;i++) if(m%i==0){
factor[++cnt]=i;
if(i*i!=m) factor[++cnt]=m/i;
}
sort(factor+1,factor+cnt+1);
cnt--;
for(int i=1;i<=cnt;i++){
ll k=(m-1)/factor[i];
add[i]=k*(k+1)/2*factor[i];
} for(int i=1;i<=n;i++){
int k=gcd(step[i],m);
for(int j=1;j<=cnt;j++)
if(factor[j]%k==0) appear[j]=1;
} ll ans=0;
for(int i=1;i<=cnt;i++) if(num[i]!=appear[i]){
ans+=add[i]*(appear[i]-num[i]);
for(int j=i+1;j<=cnt;j++)
if(factor[j]%factor[i]==0) num[j]+=(appear[i]-num[i]);
}
printf("Case #%d: %lld\n",++kk,ans);
}
return 0;
}
分析:
1.一个数的因子个数大概是log级别;
2.ax+by=c有非负整数解的条件是c%gcd(a,b);取余
=>ax+by=k*gcd(a,b) =>ax%b=k*gcd(a,b)%b =>ai*x%m=k*gcd(ai,m)%m;
所以,青蛙能走到的格子数是k*gcd(ai,m),而gcd(ai,m)又必然是m的因数,所以可以先分解出m的因子
3.但是因为有些格子可能同时被多只青蛙走,因此需要容斥一下,设appear[i]为格子i应该走的次数(只有0,1)两个值,num[i]为格子i到当前为止实际走的次数,如果当前appear[i]>appear[i],就需要加,否则减去,然后将是当前因子factor[i]倍数的因子也同时跟新num值
hdu 5514 Frogs 容斥思想+gcd 银牌题的更多相关文章
- hdu 5514 Frogs(容斥)
Frogs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- HDU 5514 Frogs 容斥定理
Frogs Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5514 De ...
- ACM-ICPC 2015 沈阳赛区现场赛 F. Frogs && HDU 5514(容斥)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5514 题意:有m个石子围成一圈, 有n只青蛙从跳石子, 都从0号石子开始, 每只能越过xi个石子.问所 ...
- HDU 5213 分块 容斥
给出n个数,给出m个询问,询问 区间[l,r] [u,v],在两个区间内分别取一个数,两个的和为k的对数数量. $k<=2*N$,$n <= 30000$ 发现可以容斥简化一个询问.一个询 ...
- HDU 2588 思维 容斥
求满足$1<=X<=N ,(X,N)>=M$的个数,其中$N, M (2<=N<=1000000000, 1<=M<=N)$. 首先,假定$(x, n)=m$ ...
- 很好的容斥思想 HDU 5514
题目描述:有n只青蛙,m个石头(围成圆圈).第i只青蛙每次只能条a[i]个石头,问最后所有青蛙跳过的石头的下标总和是多少? 思路:经过绘图我们发现,每次跳过的位置一定是k*gcd(a[i], m).然 ...
- HDU 5514 Frogs (容斥原理)
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=5514 题意 : 有m个石子围成一圈, 有n只青蛙从跳石子, 都从0号石子开始, 每只能越过a[i] ...
- HDU 5514 Frogs(容斥原理)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5514 [题目大意] m个石子围成一圈,标号为0~m-1,现在有n只青蛙,每只每次跳a[i]个石子, ...
- HDU 5514 Frogs
Frogs Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ID: 5514 ...
随机推荐
- golang代码中生成pprof和trace报告
// 生成 CPU 报告 import ( "context" "runtime/pprof" "log" ) func cpuProfil ...
- .NET Core 创建Windows服务
.NET Core 创建Windows服务 作者:高堂 原文地址:https://www.cnblogs.com/gaotang/p/10850564.html 写在前面 使用 TopShelf+Au ...
- Swagger学习(三、配置扫描接口)
生产环境中使用,发布的时候不能使用
- DIP原则
依赖倒置原则(Dependence Inversion Principle,DIP)的原始定义: 高层模块不应该依赖底层模块,两者都应该依赖其抽象: 抽象不应该依赖细节: 细节应该依赖抽象.
- LeetCode:184.部门工资最高的员工
题目链接:https://leetcode-cn.com/problems/department-highest-salary/ 题目 Employee 表包含所有员工信息,每个员工有其对应的 Id, ...
- JavaScript Basics_Fundamentals Part 2_A simple calendar
下方的日历框架是从 Active learning: A simple calendar 上整过来的. 主要任务是用 if...else 语句来让日历本显示出每月相对应的天数,相关代码已经给出,我们只 ...
- bootstrap-table的简单使用
先上效果图: 第一步:引用bootstrap-table的样式和js. @Styles.Render("~/assets/css/bootstrap.css") @Styles.R ...
- requests模块高级操作之proxies
一.代理proxy 概念:代理服务器 作用:请求和响应的转发 免费代理 www.goubanjia.com 快代理 西祠代理 代理精灵(付费) 匿名度: 透明:对方服务器知道你使用代理也知道你真实ip ...
- asp.net page类
1 page 继承自control类 2 httpServerUtility的transfer方法:请求生命周期将在调用此方法之后终止,将不会触发后续的请求生命周期事件,将直接跳到logReques ...
- Python-memcached的使用用法
Memcached API set(key,val,time=0,min_compress_len=0) 无条件键值对的设置,其中的time用于设置超时,单位是秒,而min_compress_len则 ...