HDU 5514 Frogs 欧拉函数
题意:
有\(m(1 \leq m \leq 10^9)\)个石子排成一圈,编号分别为\(0,1,2 \cdots m-1\)。
现在在\(0\)号石头上有\(n(1 \leq n \leq 10^4)\)只青蛙。第\(i\)只青蛙每次能往前跳\(a_i\)步,但是他们跳的次数不加限制。
如果一块石头能至少被一只青蛙跳上去,那么称这块石头被占领了。
求所有可能被占领的石头的编号和。
分析:
首先我们应该发现这样一个事实:
每次向前跳\(a_i\)步的效果和跳\(GCD(a_i, m)\)步是一样的
所以可以对每个\(a_i\)和\(m\)求个\(GCD\),然后排序去重,这样\(a_i\)的数量就会很少。
在第一个样例中,\(m=12\),求完\(GCD\)的\(a_i\)为\((2, 3)\)。
那么被\(2\)占领的石块的编号为\((0, 2, 4, 6, 8, 10)\);被\(3\)占领的石块的编号为\((0, 3, 6, 9)\)。
显然这样是有重复的,\(6\)号石块既会被\(2\)占领,又会被\(3\)占领。
和HDU 5528 Count a * b这题一样,为了避免算重,我们规定:
编号为\(i\)的石块只会被步长为\(GCD(i, m)\)的青蛙占领
在这之前我们还要预处理一下:
找出\(m\)所有的约数,然后用一个标记数组标记这些约数中存在哪些步长的青蛙。还要把所有步长的倍数也都标记上,也就是说有一个步长为\(d\)的青蛙,如果\(kd\)也是\(m\)的约数,我们可以假设还有一只步长为\(kd\)的青蛙存在。因为这样并不影响最终的结果。
还是上面那个例子,对于步长为\(2\)的青蛙,我们只统计\((2,10)\)这两个石块。其他的\((4,8)\)这两个石块会在步长为\(4\)的青蛙中统计,\((6)\)这个石块会在步长为\(6\)的青蛙中统计上。
一般地,对于步长为\(d\)的青蛙,我们要统计的石块的个数就是\([1,\frac{m}{d}]\)互质的个数,即\(\phi(\frac{m}{d})\)。
这些石块的编号和为\(d \cdot \frac{\frac{m}{d} \phi(\frac{m}{d})}{2}=m\frac{\phi(\frac{m}{d})}{2}\)。
解释一下上面公式:
其实我们只需要证明这样一条公式:
\(n > 1\)时,\([1,n]\)中与\(n\)互质的数字之和为:\(\frac{n \phi(n)}{2}\)
证明:
因为\(GCD(n,i)=GCD(n,n-i)\),所以如果有\(GCD(n,i)=1\),那么也一定有\(GCD(n,n-i)=1\)成立。
所以满足\(GCD(n,i)=1\)的数都是成对出现的,而且它俩的和为\(n\)。
还要证明一下,这样不会算重,也就是不会出现\(i=n-i\)的情况。
因为如果\(i=n-i \Rightarrow n=2i\),得到\(n\)是偶数,\(i=\frac{n}{2}\)。显然\(GCD(n,i) \neq 1\),推出矛盾。
上面是针对\(n>2\)的情况,幸运的是,\(n=2\)也满足这条公式。
证毕。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#define MP make_pair
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int maxp = 32000;
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a%b); }
int pcnt;
int prime[maxp], phi[maxp];
bool vis[maxp];
void preprocess() {
for(int i = 2; i < maxp; i++) {
if(!vis[i]) {
prime[pcnt++] = i;
phi[i] = i - 1;
}
for(int j = 0; j < pcnt && i * prime[j] < maxp; j++) {
vis[i * prime[j]] = true;
if(i % prime[j] == 0) {
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
else phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
LL Phi(int n) {
if(n < maxp) return phi[n];
LL ans = 1;
for(int i = 0; i < pcnt; i++) {
if(prime[i] * prime[i] > n) break;
for(int j = 0; n % prime[i] == 0; j++) {
if(!j) ans *= (prime[i] - 1);
else ans *= prime[i];
n /= prime[i];
}
}
if(n > 1) ans *= (n - 1);
return ans;
}
const int maxn = 10000 + 10;
int n, m;
int a[maxn];
vector<PII> divide;
vector<int> factors;
bool occupied[maxn];
void dfs(int d, int x) {
if(d == divide.size()) {
factors.push_back(x);
return ;
}
int p = divide[d].first, e = divide[d].second;
for(int i = 0; i <= e; i++) {
dfs(d+1, x);
x *= p;
}
}
int main()
{
preprocess();
int T; scanf("%d", &T);
for(int kase = 1; kase <= T; kase++) {
printf("Case #%d: ", kase);
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++) {
scanf("%d", a + i);
a[i] = gcd(m, a[i]);
}
sort(a, a + n);
n = unique(a, a + n) - a;
if(a[0] == 1) { printf("%lld\n", (LL)m * (m-1) / 2); continue; }
divide.clear();
int t = m;
for(int i = 0; i < pcnt; i++) {
if(prime[i] * prime[i] > t) break;
if(t % prime[i] == 0) {
int cnt = 0;
while(t % prime[i] == 0) {
t /= prime[i];
cnt++;
}
divide.push_back(MP(prime[i], cnt));
}
}
if(t > 1) divide.push_back(MP(t, 1));
factors.clear();
dfs(0, 1);
sort(factors.begin(), factors.end());
int sz = factors.size();
memset(occupied, false, sizeof(occupied));
for(int i = 0; i < n; i++) {
int k = lower_bound(factors.begin(), factors.end(), a[i]) - factors.begin();
occupied[k] = true;
}
for(int i = 1; i < sz; i++) if(!occupied[i])
for(int j = 0; j < i; j++) if(factors[i] % factors[j] == 0 && occupied[j]) {
occupied[i] = true;
break;
}
LL ans = 0;
for(int i = 0; i < sz - 1; i++) if(occupied[i]) {
int t = m / factors[i];
ans += (LL)m * Phi(t) / 2;
}
printf("%lld\n", ans);
}
return 0;
}
HDU 5514 Frogs 欧拉函数的更多相关文章
- HDU 2824 简单欧拉函数
1.HDU 2824 The Euler function 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=2824 3.总结:欧拉函数 题意:求(a ...
- HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 2588 GCD (欧拉函数)
GCD Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Submit Status De ...
- HDU 1695 GCD 欧拉函数+容斥定理
输入a b c d k求有多少对x y 使得x在a-b区间 y在c-d区间 gcd(x, y) = k 此外a和c一定是1 由于gcd(x, y) == k 将b和d都除以k 题目转化为1到b/k 和 ...
- hdu 6434 Count (欧拉函数)
题目链接 Problem Description Multiple query, for each n, you need to get $$$$$$ \sum_{i=1}^{n} \sum_{j=1 ...
- HDU 1695 GCD (欧拉函数,容斥原理)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- hdu 1695 GCD (欧拉函数+容斥原理)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- Problem I. Count - HDU - 6434(欧拉函数)
题意 给一个\(n\),计算 \[\sum_{i=1}^{n}\sum_{j=1}^{i-1}[gcd(i + j, i - j) = 1]\] 题解 令\(a = i - j\) 要求 \[\sum ...
- HDU 3501【欧拉函数拓展】
欧拉函数 欧拉函数是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) . 通式:φ(x)=x*(1-1/p1)(1-1/p2)(1-1/p3)*(1-1/p4)-..(1- ...
随机推荐
- 值类型 VS 引用类型~
问 题 值 类 型 引 用 类 型 这个类型分配在哪里? 分配在栈上 分配在托管堆上 变量是怎么表示的? 值类型变量是局部复制 引用类型变量指向被分配得实例所占的内存 基类型是什么? 必须 ...
- js中Object.defineProperty()和defineProperties()
在介绍js中Object.defineProperty()和defineProperties()之前,我们了解下js中对象两种属性的类型:数据属性和访问器属性. 数据属性 数据属性包含一个数据的位置, ...
- 深入JVM内核---原理,诊断与优化
JVM的概念 JAM是Java Virtual Machine的简称.意为Java虚拟机 虚拟机 指通过软件模拟的具有完整硬件系统功能的,运行在一种完整隔离环境中的完整计算机系统 有哪些虚拟机 - V ...
- JMeter进行压力测试
一.jmeter的安装 1.从 http://jmeter.apache.org/download_jmeter.cgi 下载jmeter(图1正中间的apache-jmeter-2.13.tg ...
- 这些O2O比你们更靠谱儿
本文纯属虚构,如有雷同,全是 C2C(Copy to China). 一 「什么社区 O2O,不就是跑腿儿的?那叮*小区不好好跑腿儿,非要搞什么狗屁社交,不是死了?」 三十四岁的老刘咽了口唾沫,接着跟 ...
- UVA 1609 Foul Play 不公平竞赛 (构(luan)造(gao)+递归)
题意:有n支队伍(n是2的整数幂,2<=n<=4),打淘汰赛,胜者进入下一轮,其中1号队伍能打败至少一半的队伍,对于它不能打败的队伍l,一定存在一支它能够打败的队伍w,使得w能直接打败l, ...
- codeforce Gym 100500H ICPC Quest (简单dp)
题意:给一个nXm的矩阵,上面有一些数字,从左上角出发,每次只能往右或者往下,把沿途的数字加起来,求到达右下角的最大值是多少. 题解:简单的一个dp,设f[i][j]为到达i行j列的最大值,f[i][ ...
- 用dfs求解八皇后问题
相信大家都已经很熟悉八皇后问题了,就是指:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法.主要思路:按行进行深度优先搜索,在该 ...
- 变量和数据类型&运算符
变量和数据类型&运算符 变量 变量的作用:用来存储数据 变量命名的规范:字(字符串)下(_下划线)美($)人(¥) 数 (可以包括数字)骆驼 有意义(可以以字母,下划线,美元符号,人民币符号开 ...
- perl -p -i -w -e
.txt kllk nciuwbufcbew``````//.]];s[[..; klklkl x,dsncdk,;l,ex xw,eocxmcmck .txt .txt kkkkkkkkkkkkkk ...