HDU 5514 Frogs (容斥原理+因子分解)
题意:有n只青蛙,m个石头(围成圆圈)。第i只青蛙每次只能条ai个石头,问最后所有青蛙跳过的石头的下标总和是多少?
题解:暴力肯定会超时,首先分解出m的因子,自己本身不用分,因为石头编号是0到m-1,第i只青蛙只能走到gcd(ai, m)的位置,我们就可以把m的因子提取出来,然后对青蛙能走到的因子位置打标记。两个数组,第一个数组a代表是否能走到该因子,第二个数组b表示是否已经加过了,加过了几次,遍历到那个因子的时候要加上(a[i]-b[i])倍的数,这个数很可能是负数。至于公式利用等差数列前n项和可以得出。
注意这道题是因子分解而不是素因子分解,因为对于12来说2和4是不一样的。
注意这道题不是对数进行操作而是对因子进行操作。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
return b==?a:gcd(b,a%b);
}
const int maxn=1e5+;
ll cnt=,prime[maxn];
void solve(ll m)
{
cnt=;//注意初始化
prime[cnt++]=;
for(int i=; i<sqrt(m); i++)
{
if(m%i==)
{
prime[cnt++]=i;
prime[cnt++]=m/i;
}
}
ll tmp=sqrt(m);
if(tmp*tmp==m)
prime[cnt++]=tmp;
sort(prime,prime+cnt);
}
int main()
{
int t,cas=;
scanf("%d",&t);
while(t--)
{
ll n,m,data,tmp;
scanf("%lld%lld",&n,&m);
memset(prime,,sizeof(prime));
solve(m);
ll a[maxn],b[maxn];
memset(a,,sizeof(a));//标记
memset(b,,sizeof(b));//算过了几次
for(int i=; i<n; i++)
{
scanf("%lld",&data);
tmp=gcd(data,m);
for(int j=; j<cnt; j++)
{
if(prime[j]%tmp==)
a[j]=;
}
}
ll ans=;
for(int i=; i<cnt; i++)
{
ll num=a[i]-b[i];
if(num!=)
{
ll tmp=(m-)/prime[i];
ans=ans+tmp*(tmp+)/*prime[i]*num;
for(int j=i; j<cnt; j++)
{
if(prime[j]%prime[i]==)
b[j]=b[j]+num; //注意是b表示数目
}
}
}
printf("Case #%d: %lld\n",cas++,ans);
}
return ;
}
更新版:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
return b==?a:gcd(b,a%b);
}
const int maxn=1e5+;
ll prime[maxn],a[maxn];
int cnt=;
void solve(ll m)
{
memset(a,,sizeof(a));
memset(prime,,sizeof(prime));
cnt=;
prime[cnt++]=;
for(int i=;i<sqrt(m);i++)
{
if(m%i==)
{
prime[cnt++]=i;
prime[cnt++]=m/i;
}
}
if(ll(sqrt(m))*ll(sqrt(m))==m) prime[cnt++]=ll(sqrt(m));
sort(prime,prime+cnt);
}
int main()
{
int t,cas=;
scanf("%d",&t);
while(t--)
{
ll n,m,data;
scanf("%lld%lld",&n,&m);
solve(m);
for(int i=;i<n;i++)
{
scanf("%lld",&data);
data=gcd(data,m);
for(int j=;j<cnt;j++)
if(prime[j]%data==) a[j]=;
}
ll ans=;
for(int i=;i<cnt;i++)
{
ll num=a[i];
if(num!=)
{
ll tmp=(m-)/prime[i];
ans+=tmp*(tmp+)/*prime[i]*num;
for(int j=i+;j<cnt;j++)
if(prime[j]%prime[i]==) a[j]-=num;
}
}
printf("Case #%d: %lld\n",cas++,ans);
}
return ;
}
HDU 5514 Frogs (容斥原理+因子分解)的更多相关文章
- HDU 5514 Frogs (容斥原理)
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=5514 题意 : 有m个石子围成一圈, 有n只青蛙从跳石子, 都从0号石子开始, 每只能越过a[i] ...
- hdu 5514 Frogs(容斥)
Frogs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- 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: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5514 De ...
- HDU 5514 Frogs
Frogs Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ID: 5514 ...
- HDU 5514 Frogs 欧拉函数
题意: 有\(m(1 \leq m \leq 10^9)\)个石子排成一圈,编号分别为\(0,1,2 \cdots m-1\). 现在在\(0\)号石头上有\(n(1 \leq n \leq 10^4 ...
- HDU 5514 Frogs (数论容斥)
题意:有n只青蛙,m个石头(围成圆圈).第i只青蛙每次只能条ai个石头,问最后所有青蛙跳过的石头的下标总和是多少? 析:首先可以知道的是第 i 只青蛙可以跳到 k * gcd(ai, m),然后我就计 ...
- hdu 5514 Frogs 容斥思想+gcd 银牌题
Frogs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- HDU 5514.Frogs-欧拉函数 or 容斥原理
Frogs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
随机推荐
- asp.net input怎么获取值
前台: <input type="hidden" name="content" value="content"> 后台: Req ...
- Mybatis的ResultMap的使用
本篇文章通过一个实际工作中遇到的例子开始吧: 工程使用Spring+Mybatis+Mysql开发.具体的业务逻辑很重,对象之间一层一层的嵌套.和数据库表对应的是大量的model类,而和前端交互的是V ...
- iOS推送失败的可能问题汇总
ITC上的证书问题 AppID未开启推送 Provioning Profile在AppID开启推送功能前生成的 Provioning证书过期 推送的pem证书过期 客户端问题 target的CodeS ...
- 使用Jquery+EasyUI 进行框架项目开发案例讲解之五 模块(菜单)管理源码分享
http://www.cnblogs.com/huyong/p/3454012.html 使用Jquery+EasyUI 进行框架项目开发案例讲解之五 模块(菜单)管理源码分享 在上四篇文章 ...
- jdk版本
windows: set java_home:查看JDK安装路径 java -version:查看JDK版本 linux: whereis java which java (java执行路径) ech ...
- jquery------捕获异常处理
web.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC ...
- MyEclipse------从MySQL取出图片
showImage.jsp <%@ page language="java" import="java.util.*" pageEncoding=&quo ...
- sql-server数据库中利用触发器实现表与表之间的级联删除
create trigger Delete_Student --创建一个触发器 on student instead of delete as declare @sno varchar() selec ...
- ecshop后台admin路径怎么修改
ecshop后台admin路径怎么修改 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2013-03-25 ecshop如何修改后台admin路径? 大家都知道ec ...
- GIT本地操作
01. GIT简介(PPT) ================================================================================ 02. ...