题目链接

题意:有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. STL简单应用问题

    问题: Input输入的第一行是一个整数T( 1 <= T <= 100 ),表示有几组输入数据.每组输入由4部分组成:(1)一个字典,最多包含2000个单词,每个单词一行.(2)一行字符 ...

  2. POJ 2559 Largest Rectangle in a Histogram

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18942   Accepted: 6083 Description A hi ...

  3. [IOS+PHP Jason格式的发送与解析]

    服务器端PHP文件connect.php: <?php $q = mysql_connect("localhost","root","" ...

  4. java反射学习

    通过一个对象获得完整的包名和类名 package reflect; public class GetClass { public static void main(String[] args) { G ...

  5. Android学习笔记02-Mac下编译java代码

    在Mac OS上配置JDK 1.7. 一 下载 Mac版本的JDK1.7 从以下下载地址,下载Mac版本的JDk1.7 安装文件 jdk-7u79-macosx-x64.dmg. http://www ...

  6. nginx负载均衡的配置方法

    upstream www.***.com { server ; server ; server ; } server { listen ; server_name www.***.com; #char ...

  7. Java-TCP Socket编程

    TCP 的 Java 支持 协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构.交换方式.包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP 协议族有 IP 协议.TCP 协议和 ...

  8. Debian普通用户添加sudo权限

    转自:http://chenpeng.info/html/964 刚安装好的Debian默认还没有sudo功能.1.安装sudo# apt-get install sudo2.修改 /etc/sudo ...

  9. 在Windows的Tomcat环境下部署Solr 4.7.0

    主要步骤如下: 1.下载solr-4.7.0.tgz; 2.解压缩solr-4.7.0.tgz,解压后目录结构如下: 3.将example/webapps目录下的solr.war复制到tomcat的w ...

  10. BI就是报表?

    实际上,报表只是BI的一部分,虽然BI应用的结果通常需要通过报表来展示,但是,BI绝对不仅仅是报表.其实,大家对这些概念的理解,如同15年前的ERP一样.1998年,国内两大巨头金蝶与用友都开始宣称从 ...