UVA - 11014 Make a Crystal (莫比乌斯反演)
给定一个n*n*n的立方体(中心点为原点O),选择尽量多的点,使得对于任意两点A,B,B不在线段OA上。
可以发现,原问题可转化为三维坐标下的点(x,y,z)中有多少个点的gcd(x,y,z)=1。
这道题我一开始想用欧拉函数做,但我发现需要求出1-n中与每个整数x互质的数的个数,于是试图修改一下欧拉函数的公式,结果发现计算出来的结果存在微小的偏差,原因是n不一定能被x的所有因子整除,使得(n/p)*(n/q)≠n/pq。被逼无奈,于是学了莫比乌斯反演。
莫比乌斯反演的做法是:令$n=n/2$,在$1\leqslant x,y,z\leqslant n$的限制条件下,设$f(X)$为$gcd(x,y,z)=X$的点的个数,$F(X)$为$gcd(x,y,z)=kX$的点的个数,则$F(X)=\sum\limits_{X|d}f(d)$,根据莫比乌斯反演定理则有$f(X)=\sum \limits_{X|d}\mu (\frac{d}{X})F(d)$,$f(1)$即为$x,y,z$均大于0情况下的答案。由于又有$F(X)=\left \lfloor \frac{n}{X} \right \rfloor^3$,因此可以在$O(n)$的时间内算出$f(X)$。
然后用同样的方法可以算出$x,y,z$中有一个为0,另外两个大于0情况下的答案,将$F(X)$换为$\left \lfloor \frac{n}{X} \right \rfloor^2$即可。
一共有8个卦限,坐标平面上的12个象限,将结果乘一乘加一加,再加上在坐标轴上的6种情况,就得到答案了。
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const ll N=1e5+;
- ll n,mu[N],d[N],c[N],ka;
- void init() {
- mu[]=;
- for(ll i=; i<N; ++i)if(mu[i])
- for(ll j=i*; j<N; j+=i)mu[j]-=mu[i];
- }
- ll F1(ll x) {return (n/x)*(n/x)*(n/x);}
- ll F2(ll x) {return (n/x)*(n/x);}
- ll f(ll x,ll F(ll)) {
- ll ret=;
- for(ll i=x; i<=n; i+=x)ret+=F(i)*mu[i/x];
- return ret;
- }
- int main() {
- init();
- while(scanf("%lld",&n)&&n) {
- n/=;
- printf("Crystal %lld: %lld\n",++ka,f(,F1)*+f(,F2)*+);
- }
- return ;
- }
还可以进一步优化,利用整除分块的方法,将复杂度降到$O(\sqrt n)$
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const ll N=1e5+;
- ll n,mu[N],smu[N],ka,ans;
- void init() {
- mu[]=;
- for(ll i=; i<N; ++i)if(mu[i])
- for(ll j=i*; j<N; j+=i)mu[j]-=mu[i];
- for(ll i=; i<N; ++i)smu[i]=smu[i-]+mu[i];
- }
- int main() {
- init();
- while(scanf("%lld",&n)&&n) {
- n/=;
- ans=;
- for(ll l=,r; l<=n; l=r+) {
- ll t=n/l;
- r=n/t;
- ans+=(t*t*t*+t*t*)*(smu[r]-smu[l-]);
- }
- ans+=;
- printf("Crystal %lld: %lld\n",++ka,ans);
- }
- return ;
- }
以上筛莫比乌斯函数的方法复杂度是$O(nlogn)$的,也可以换成复杂度更低的$O(n)$的线性筛法,只是代码略长,不再赘述了。
UVA - 11014 Make a Crystal (莫比乌斯反演)的更多相关文章
- UVA 11014 - Make a Crystal(容斥原理)
UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, ...
- UVa 11014 (莫比乌斯反演) Make a Crystal
这个题是根据某个二维平面的题改编过来的. 首先把问题转化一下, 就是你站在原点(0, 0, 0)能看到多少格点. 答案分为三个部分: 八个象限里的格点,即 gcd(x, y, z) = 1,且xyz均 ...
- UVa 10214 (莫比乌斯反演 or 欧拉函数) Trees in a Wood.
题意: 这道题和POJ 3090很相似,求|x|≤a,|y|≤b 中站在原点可见的整点的个数K,所有的整点个数为N(除去原点),求K/N 分析: 坐标轴上有四个可见的点,因为每个象限可见的点数都是一样 ...
- hdu1695 GCD(莫比乌斯反演)
题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...
- HDU 1695 GCD (莫比乌斯反演)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 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 ...
- hdu 1965 (莫比乌斯函数 莫比乌斯反演)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu1695(容斥 or 莫比乌斯反演)
刚开始看题,想了一会想到了一种容斥的做法.复杂度O( n(3/2) )但是因为题目上说有3000组测试数据,然后吓尿.完全不敢写. 然后想别的方法. 唉,最近精神有点问题,昨天从打完bc开始想到1点多 ...
随机推荐
- 合并apk和odex 为完整的apk安装文件
from:http://bbs.hiapk.com/thread-1151284-1-1.html 文件夹:<ignore_js_op> 文件夹拖放到odex.cmd,出现下面的窗口后,按 ...
- dataTables的用法
原地址:http://blog.csdn.net/mickey_miki/article/details/8240477 1.DataTables的默认配置 $(document).ready(fun ...
- Python学习进程(2)Python环境的搭建
本节主要介绍在windows和Linux平台上如何搭建Python编程环境. (1)查看Python版本: windows: C:\Users\JMSun>python 'pyt ...
- 每天一个Linux命令(54)chkconfig命令
chkconfig命令检查.设置系统的各种服务. (1)用法: 用法: chkconfig [必要参数] [服务] (2)功能: 功能: chkconf ...
- 每天一个Linux命令(41)iostat命令
iostat是I/O statistics(输入/输出统计)的缩写,对系统的磁盘操作活动进行监视.它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况. (1)用法: ...
- 【Head First Servlets and JSP】笔记12:URL重写
1.会话管理的核心在于“交换会话ID”,来回传递cookie是最简单的方法,容器通过客户端发来的JSSESIONID查找匹配的对话. 2.如果浏览器禁用了cookie,那就意味着浏览器将忽略响应首部中 ...
- 如何通过http接口使用f12b实现批量提交链接
这里我们分别叙述了如何在浏览器直接使用此接口,以及通过java和python如何使用此接口. 一.以浏览器为例 (一)提交一个指令 serverURL=http://120.79.247.23/f12 ...
- Kubernetes Storage
参考文章: https://kubernetes.io/docs/concepts/storage/volumes/ https://www.cnblogs.com/styshoo/p/6731425 ...
- mongodb count 导致不正确的数量(mongodb count 一个坑)
在mongodb 集群中,if 存在orphaned documents 和chunk migration, count查询可能会导致一个不正确的查询结果,例如我就是踩的这个坑,先不说话,看结果: ...
- P3391 文艺平衡树
hh 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...