博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法笔记--莫比乌斯反演
阅读量:7134 次
发布时间:2019-06-28

本文共 4699 字,大约阅读时间需要 15 分钟。

这个B站上的视频讲的不错:

定理:是定义在非负整数集合上的两个函数,并且满足条件,那么我们得到结论

 

     

 

在上面的公式中有一个函数,它的定义如下:

 

    (1)若,那么

    (2)若均为互异素数,那么

    (3)其它情况下

 

 

对于函数,它有如下的常见性质:

 

    (1)对任意正整数

  

                            

 

        (2)对任意正整数

 

         

         

线性筛选求莫比乌斯反演函数代码:

void Mobius(){    mem(vis,false);    mu[1]=1;    cnt=0;    for(int i=2;i

例题1:

代码:

#include
using namespace std;#define ll long long#define pb push_back#define mem(a,b) memset(a,b,sizeof(a))const int N=1e5+5; int prime[N];bool not_prime[N]={
false};int mu[N];void Mobius(){ mu[1]=1; int k=0; for(int i=2;i
>T; for(int Case=1;Case<=T;Case++) { cin>>a>>b>>c>>d>>k; if(k==0){ cout<<"Case "<
<<": 0"<
View Code

例题2:

代码:

#include
using namespace std;#define ll long long#define pb push_back#define mem(a,b) memset(a,b,sizeof(a))const int N=1e5+5;const int INF=0x3f3f3f3f; const int MOD=1e9+7;int a[N];int prime[N];bool not_prime[N]={
false};int mu[N];int cnt[2*N];void Mobius(){ mu[1]=1; int k=0; for(int i=2;i
>=1; } return ans;}int main(){ /*ios::sync_with_stdio(false); cin.tie(0);*/ int T; int n; Mobius(); scanf("%d",&T); for(int Case=1;Case<=T;Case++) { int mn=INF; int mx=0; mem(cnt,0); scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]),mn=min(mn,a[i]),mx=max(mx,a[i]); for(int i=1;i<=n;i++)cnt[a[i]]++; for(int i=1;i<2*N;i++)cnt[i]+=cnt[i-1]; ll ans=0; for(int i=2;i<=mn;i++) { ll t=1; for(int j=1;j*i<=mx;j++) { t=(t*q_pow(j,cnt[(j+1)*i-1]-cnt[j*i-1]))%MOD; } ans=(ans-mu[i]*t%MOD+MOD)%MOD; } printf("Case #%d: %lld\n",Case,ans); } return 0;}
View Code

例题3:Codeforces 

提示:C(n,2)=n*(n-1)/2=1+2+...+n-1

代码:

#include
using namespace std;#define ll long long#define pb push_back#define mem(a,b) memset(a,b,sizeof(a))const int N=5e5+5;const int INF=0x3f3f3f3f; const int MOD=1e9+7;int a[N];int prime[N];bool not_prime[N]={
false};bool vis[N]={
false};int mu[N];int cnt[N];void Mobius(){ mu[1]=1; int k=0; for(int i=2;i
>n>>q; for(int i=1;i<=n;i++)cin>>a[i]; ll ans=0; while(q--) { cin>>t; if(!vis[t]) { vis[t]=true; for(int i=1;i*i<=a[t];i++) { if(a[t]%i==0) { ans+=(ll)mu[i]*cnt[i]; cnt[i]++; if(i*i!=a[t])ans+=mu[a[t]/i]*cnt[a[t]/i],cnt[a[t]/i]++; } } } else { vis[t]=false; for(int i=1;i*i<=a[t];i++) { if(a[t]%i==0) { cnt[i]--; ans-=(ll)mu[i]*cnt[i]; if(i*i!=a[t])cnt[a[t]/i]--,ans-=mu[a[t]/i]*cnt[a[t]/i]; } } } cout<
<
View Code

例题4:大白书P301石头染色方案计数

代码:

 

#include
#include
#include
#include
#include
using namespace std;#define fi first#define se second#define pi acos(-1.0)#define LL long long//#define mp make_pair#define pb push_back#define ls rt<<1, l, m#define rs rt<<1|1, m+1, r#define ULL unsigned LL#define pll pair
#define pli pair
#define pii pair
#define piii pair
#define mem(a, b) memset(a, b, sizeof(a))#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);//headconst int mod = 1e9 + 7;LL q_pow(LL n, LL k) { LL ans = 1; while(k) { if(k&1) ans = (ans * n) % mod; n = (n * n) % mod; k >>= 1; } return ans;}map
get_mu(int n) { map
res; vector
p; for (int i = 2; i * i <= n; i++) { if(n % i == 0) { p.pb(i); while(n % i == 0) n /= i; } } if(n > 1) p.pb(n); int m = (int)p.size(); for (int i = 0; i < (1<
mu = get_mu(i); LL t = 0; for (map
::iterator it = mu.begin(); it != mu.end(); it++) { t = (t + (it->se) * q_pow(m, i/(it->fi))) % mod; } t = (t * q_pow(i, mod-2)) % mod; ans = (ans + t) % mod; } else { int t1 = i, t2 = n/i; map
mu = get_mu(t1); LL t = 0; for (map
::iterator it = mu.begin(); it != mu.end(); it++) { t = (t + (it->se) * q_pow(m, t1/(it->fi))) % mod; } t = (t * q_pow(t1, mod-2)) % mod; ans = (ans + t) % mod; mu = get_mu(t2); t = 0; for (map
::iterator it = mu.begin(); it != mu.end(); it++) { t = (t + (it->se) * q_pow(m, t2/(it->fi))) % mod; } t = (t * q_pow(t2, mod-2)) % mod; ans = (ans + t) % mod; } } } printf("%lld\n", ans); } return 0;}
View Code

 

 

 

 

 

 

转载于:https://www.cnblogs.com/widsom/p/7701129.html

你可能感兴趣的文章
大数据||MapReduce的shuffle
查看>>
wxWidgets第十二课 wxBufferedPaintDC OnPaint函数中的双缓存DC
查看>>
openstack G Version about snapshot , create ,delete
查看>>
搞定她
查看>>
AngularJS中的模块(module)
查看>>
对 Linux 新手非常有用的 20 个命令
查看>>
如何保证只有一个进程实例
查看>>
自动化运维之Samba4.2.0部署遇到问题:Ignoring invalid value 'share' for parameter 'security'...
查看>>
consul安装
查看>>
appcompat_v7的作用以及编译错误
查看>>
tail 命令 查看Tomcat目录下日志的最后几行的方法
查看>>
逻辑滚动条管理员 (Logical Volume Manager)的讨论
查看>>
WINSOCK RESET解决只能通过IP地址访问目的地址,而域名无法访问的问题。
查看>>
在线旅游资源点评受宠,但质量参差不齐
查看>>
阿里通信携手联通MWC演示“智选加速” 预演5G垂直应用
查看>>
Windows 7如何禁止在C盘上安装软件?
查看>>
算法学习之路|朋友数
查看>>
ssh到远程主机杀死进程
查看>>
Linux批量远程命令和上传下载工具
查看>>
使用System Center Essentials 2007查看计算机的软件清单
查看>>