ACM-ICPC (10/11)
莫比乌斯
今年的多校比赛,莫比乌斯反演的题目经常出现,但是我们队对于这种题可以说是直接放掉,不是因为没学过,多少了解一些,但是也只是皮毛,导致根本就做不出来,其实想一想,其实次数多了,就可以看出原因了,没有过总结,没有过思考,昨天心血来潮,好好的看了一下莫比乌斯反演,有一点感悟!
什么是莫比乌斯反演
...
可以通过 反向推导出
...
公式:
其中 即为莫比乌斯函数。
也可以如下定义:
分解质因数,无不相同,则
其他为0
性质:积性函数
莫比乌斯(容斥的优化)——我的理解
怎么求莫比乌斯函数?
类似于筛素数的方案,O(nlogn),一般足够了。
级别,无法预处理出1~n的莫比乌斯表,利用因式分解,讨论因子的拿法(类似压状),O(sqrt(n))
栗子:
//求莫比乌斯函数 O(nlogn)
void getMu() {
for(int i = 1; i < maxn; i++) {
int target = i == 1 ? 1 : 0;
int delta = target - mu[i];
mu[i] = delta;
for(int j = i + i ; j < maxn; j+=i)
mu[j] +=delta;
}
}
// n 的 约数的莫比乌斯函数值map形式返回 O(sqrt(n))
map<int,int> moebius(int n) {
map<int,int> res;
vector<int> primes;
//枚举n的质数
for(int i = 2; i*i <= n; i++) {
if(n%i==0) {
primes.push_back(i);
while(n%i==0) n/=i;
}
}
if(n!=1) primes.push_back(n);
int m = primes.size();
//不超过n的约数个数 次
for(int i = 0; i < (1<<m); i++) {
int mu = 1,d = 1;
for(int j = 0; j < m; j++) {
if(i>>j&1) {
mu*=-1;
d*=primes[j];
}
}
res[d] = mu;
}
return res;
}
例题一:
分析:总共26^n,根据容斥,枚举最短循环节d,减去26^d,根据莫比乌斯函数来容斥优化。注意数据范围极大!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// n 的 约数的莫比乌斯函数值map形式返回 O(sqrt(n))
map<int,int> moebius(int n) {
map<int,int> res;
vector<int> primes;
//枚举n的质数
for(int i = 2; i*i <= n; i++) {
if(n%i==0) {
primes.push_back(i);
while(n%i==0) n/=i;
}
}
if(n!=1) primes.push_back(n);
int m = primes.size();
//不超过n的约数个数 次
for(int i = 0; i < (1<<m); i++) {
int mu = 1,d = 1;
for(int j = 0; j < m; j++) {
if(i>>j&1) {
mu*=-1;
d*=primes[j];
}
}
res[d] = mu;
}
return res;
}
const int MOD = 10009;
int n;
//快速幂取模 a^b % mod;
ll pow_mod(ll a,ll b) {
if(b==0) return 1%MOD;
int temp = pow_mod(a,b>>1);
temp = temp*temp%MOD; if(b&1) temp = (ll)temp*a%MOD; return temp;}void solve() { ll res = 0; map<int,int> mu = moebius(n); for(auto it = mu.begin(); it != mu.end(); it++) { //printf("%d %d\n",it->first,it->second); res += (ll)it->second*pow_mod(26,n/it->first); res = (res%MOD + MOD) % MOD; } printf("%I64d\n",res);}int main(){ scanf("%d",&n); solve(); return 0;}
例题二:
分析:
注意:(1,3),(3,1)相同。
先考虑不同的情况:
即:两个区间内互质的对数,同理:总共 对,减去不符合情况的对数,枚举gcd,就有 * 对,然后用莫比乌斯来容斥。
怎么解决(1,3)(3,1)相同的情况呢?
还是容斥!!!
减去较小区间做一遍上述操作的一半。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1<<20;
int mu[maxn];
//求莫比乌斯函数
void getMu() {
for(int i = 1; i < maxn; i++) {
int target = i == 1 ? 1 : 0;
int delta = target - mu[i];
mu[i] = delta;
for(int j = i + i ; j < maxn; j+=i)
mu[j] +=delta;
}
}
int main()
{
getMu();
int T;
scanf("%d",&T);
for(int z = 1; z <= T; z++) {
int a,b,c,d,k;
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
if(k==0) {
puts("0");
continue;
}
b/=k;
d/=k;
if(b>d) swap(b,d); //b小
long long ans1 = 0;
for(int i = 1; i <= b; i++)
ans1 += (long long)mu[i]*(b/i)*(d/i);
long long ans2 = 0;
for(int i = 1; i <= b; i++) ans2 += (long long)mu[i]*(b/i)*(b/i); ans1 -= ans2/2; printf("%I64d\n",ans1); } return 0;}
例题三:
题意:给定一个正方体的区间,从坐标(0,0,0)处可以看到多少个整点?
分析:(1,1,1) 能看到,但是(2,2,2)就三点共线挡住了,同理(2,3,4)能看到,但是(4,6,8)就看不到了,可以看出就是 的点,被除以gcd的点挡住了。也就是求 (x,y,z)互质的点对,就是上一题加一维。
值得注意的是区间是[1,n],整个坐标系可以x = 0等,x等于0,相当于一个平面,减一围。
还有3个坐标轴上的点。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1<<20;
int mu[maxn];
//求莫比乌斯函数
void getMu() {
for(int i = 1; i < maxn; i++) {
int target = i == 1 ? 1 : 0;
int delta = target - mu[i];
mu[i] = delta;
for(int j = i + i ; j < maxn; j+=i)
mu[j] +=delta;
}
}
typedef long long ll;
int main()
{
getMu();
int t;
scanf("%d",&t);
while(t--) {
int n;
scanf("%d",&n);
ll ans = 3;
for(int i = 1; i <= n; i++)
ans+= (ll)mu[i]*(n/i)*(n/i)*(n/i+3);
printf("%lld\n",ans);
}
return 0;
}
到此,你就已经入门莫比乌斯了~~~
TreeDream
ACM-ICPC (10/11)的更多相关文章
- hduoj 4715 Difference Between Primes 2013 ACM/ICPC Asia Regional Online —— Warmup
http://acm.hdu.edu.cn/showproblem.php?pid=4715 Difference Between Primes Time Limit: 2000/1000 MS (J ...
- 2016 ACM/ICPC Asia Regional Qingdao Online 1001/HDU5878 打表二分
I Count Two Three Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 2016 ACM/ICPC Asia Regional Shenyang Online 1009/HDU 5900 区间dp
QSC and Master Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- 2016 ACM/ICPC Asia Regional Dalian Online 1006 /HDU 5873
Football Games Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)
队名:Unlimited Code Works(无尽编码) 队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...
- 2016 ACM/ICPC Asia Regional Qingdao Online(2016ACM青岛网络赛部分题解)
2016 ACM/ICPC Asia Regional Qingdao Online(部分题解) 5878---I Count Two Three http://acm.hdu.edu.cn/show ...
- 2017 ACM/ICPC Asia Regional Qingdao Online
Apple Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submi ...
- ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))
祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...
- ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 D. Delay Time
Problem D. Delay Time Input file: standard input Output file: standard output Time limit: 1 second M ...
- hduoj 4710 Balls Rearrangement 2013 ACM/ICPC Asia Regional Online —— Warmup
http://acm.hdu.edu.cn/showproblem.php?pid=4710 Balls Rearrangement Time Limit: 6000/3000 MS (Java/Ot ...
随机推荐
- vue搭建后台管理页面(点击左侧导航,切换右侧内容)
home.vue页面 <template> <div style="background-color: #EBEBEB;min-height:900px"> ...
- ansible 入门学习(一)
一,ansible 目录结构 (来自于ansible权威指南) 二,ansible.cfg 配置项说明 /etc/ansible/ansible.cfg --> ———————————————— ...
- 智能手表ticwatch穿戴体验
前言 可穿戴设备近几年越来越火,最开始是谷歌眼睛.手环,再到手表.VR眼镜,相信未来几年这片领域依旧火热~ 自从谷歌发布Android Wear.苹果发布Apple Watch之后,智能手表的战役就正 ...
- Linux服务器性能评估与优化--转
http://www.itlearner.com/article/4553 一.影响Linux服务器性能的因素 1. 操作系统级 Ø CPU Ø 内存 Ø 磁盘I/ ...
- 【软件安装】Xshell出现要继续使用此程序必须应用到最新的更新或使用新版本
资源可以用,但是安装完成后启动会报错:“要继续使用此程序,您必须应用最新的更新或使用新版本” 解决办法先修改你电脑时间为前一年(2017 1月),然后就可以打开xshell了,打开后"工具& ...
- iis6、iis7、apache设置mime类型
1.IIS6添加方法. 打开iis,展开网站,右键要设置的站点--属性.找到“http头”选项卡--mime类型 进行设置添加. 截图以.ipa mime类型举例. 2.IIS7(iis7.5.iis ...
- Java 获取当前时间距离当天凌晨的秒数
原文出自:https://blog.csdn.net/seesun2012 在前期项目中遇到一个客户端与服务器间的时间同步问题,需要获取到当前时间与当天凌晨时间距离的秒数,写这篇文章主要是为了总结一下 ...
- uiautomator 1使用简介
1.生成build.xml android create uitest-project -n jar_name -t id -p projectPah 2.修改build.xml 改成默认执行 bu ...
- Log4Net 之初体验
今天试了一下关于日志的一个插件——Log4Net 关于这个插件就不过多描述了,有很多人用,也挺好用比较方便,所以在此记录下使用过程. 一.建一个mvc 空网站 名字叫 Log4NetTest 二.下载 ...
- openLayers3 中实现多个Overlay
此篇的目的是为了记录下用Overlay的一些操作. 其实实现多个就是创建多个div,然后给每个div绑定Overlay. //页面加载完函数 --显示个关键点的名称 window.onload = f ...