题目链接

题意:有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 (容斥原理+因子分解)的更多相关文章

  1. HDU 5514 Frogs (容斥原理)

    题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=5514 题意 : 有m个石子围成一圈, 有n只青蛙从跳石子, 都从0号石子开始, 每只能越过a[i] ...

  2. hdu 5514 Frogs(容斥)

    Frogs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  3. HDU 5514 Frogs(容斥原理)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5514 [题目大意] m个石子围成一圈,标号为0~m-1,现在有n只青蛙,每只每次跳a[i]个石子, ...

  4. HDU 5514 Frogs 容斥定理

    Frogs Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5514 De ...

  5. HDU 5514 Frogs

    Frogs Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ID: 5514 ...

  6. HDU 5514 Frogs 欧拉函数

    题意: 有\(m(1 \leq m \leq 10^9)\)个石子排成一圈,编号分别为\(0,1,2 \cdots m-1\). 现在在\(0\)号石头上有\(n(1 \leq n \leq 10^4 ...

  7. HDU 5514 Frogs (数论容斥)

    题意:有n只青蛙,m个石头(围成圆圈).第i只青蛙每次只能条ai个石头,问最后所有青蛙跳过的石头的下标总和是多少? 析:首先可以知道的是第 i 只青蛙可以跳到 k * gcd(ai, m),然后我就计 ...

  8. hdu 5514 Frogs 容斥思想+gcd 银牌题

    Frogs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  9. HDU 5514.Frogs-欧拉函数 or 容斥原理

    Frogs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

随机推荐

  1. 【poj1182】 食物链

    http://poj.org/problem?id=1182 (题目链接) 题意 中文题 Solution 带权并查集. 神犇博客,秒懂 fa记录父亲,r记录与父亲的关系.%3运用的很巧妙. 代码 / ...

  2. POJ 3258 River Hopscotch

    River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11031   Accepted: 4737 ...

  3. 洛谷P1908 求逆序对 [归并排序]

    题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游 戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样 ...

  4. eclipse中运行python脚本中有注释为中文的内容,报错:SyntaxError: Non-ASCII character '\xe5'

    '''Created on 2015年7月2日 @author: liujuan'''import sysreload(sys) 以上为注释的有个日期中文的,结果运行报错:SyntaxError: N ...

  5. Spring学习8- SSH需要的jar包

    struts2 commons-logging-1.0.4.jar 主要用于日志处理 freemarker-2.3.8.jar 模板相关操作需要包 ognl-2.6.11.jar ognl表达示所需包 ...

  6. XSS Filter Evasion Cheat Sheet 中文版

    前言 译者注: 翻译本文的最初原因是当我自己看到这篇文章后,觉得它是非常有价值.但是这么著名的一个备忘录却一直没有人把它翻译成中文版.很多人仅仅是简单的把文中的 各种代码复制下来,然后看起来很刁的发在 ...

  7. linux下python版webshell后门查杀工具

    使用说明: 1.查杀指定路径:python webshell.py 路径 2.按时间查找文件:python webshell.py 路径 “2013-09-28 00:00:00″ # -*- cod ...

  8. C# 根据IP地址获取城市

    using System; using System.IO; using System.Net; using System.Text; using System.Web.Script.Serializ ...

  9. WPF RichTextBox的使用总结

    RichTextBox内容模型 RichTextBox 支持基于块的内容模型. RichTextBox   的内容属性为 Blocks,这是 Paragraph 元素的集合Paragraph元素可包含 ...

  10. 史上最浅显易懂的Git分布式版本控制系统教程

    从零起步的Git教程,让你无痛苦上手世界上最流行的分布式版本控制系统Git! 既然号称史上最浅显易懂的Git教程,那这个教程有什么让你怦然心动的特点呢? 首先,本教程绝对面向初学者,没有接触过版本控制 ...