莫比乌斯 懵比乌斯 懵比尤斯 梦比优斯。。。
首先入门博客:https://blog.csdn.net/codeswarrior/article/details/81541972
https://www.cnblogs.com/peng-ym/p/8647856.html
hdu 1695
欧拉+容斥
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
typedef long long ll;
ll phi[maxn];
void init(){
phi[1] = 1;
for(ll i = 2; i < maxn; i++){
phi[i] = i;
}
for(ll i = 2; i < maxn; i++){
if(phi[i] == i){
for(ll j = i; j < maxn; j += i){
phi[j] = phi[j] / i * (i - 1);
}
}
}
for(ll i = 2; i < maxn; i++){
phi[i] += phi[i-1];
}
}
ll owprime[maxn];
ll ownum=0;
ll solve(ll d,ll n) //求1-d中有多少个与n互质的数
{
ownum=0;
for(ll i = 2; i * i <= n; i++){
if(n % i == 0){
owprime[ownum++] = i;
while(n % i == 0) n /= i;
}
}
if(n > 1) owprime[ownum++] = n;
ll sum=0;
for(ll i=1; i<(1<<ownum) ;i++)
{
ll tmp=1,cnt=0;
for(ll j=0;j<ownum;j++)
{
if(i & (1<<j))
{
tmp*=owprime[j];
cnt++;
}
}
if(cnt&1)
sum+=d/tmp;
else
sum-=d/tmp;
}
return d-sum;
}
int main()
{
ll T;
scanf("%lld",&T);
ll t=0;
ll a,b,c,d,k;
init();
while(T--)
{
ll ans=0;
scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&k);
//b大
if(k == 0 || k > b || k > d)
{
printf("Case %lld: 0\n",++t);
continue;
}
if(b<d) swap(b,d);
b=b/k;
d=d/k;
for(ll i=d+1;i<=b;i++)
{
ans+=solve(d,i);
}
printf("Case %lld: %lld\n",++t,ans+phi[d]);
}
return 0;
}
懵比乌斯
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
typedef long long ll;
ll isprime[maxn];
ll prime[maxn];
ll num;
ll mu[maxn];
void init()
{
memset(isprime,false,sizeof isprime);
mu[1]=1;
for(ll i=2;i<maxn;i++)
{
if(!isprime[i])
{
prime[num++]=i;
mu[i]=-1;
}
for(ll j=0;j<num && i*prime[j]<maxn;j++)
{
isprime[i*prime[j]]=true;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
else
mu[i*prime[j]]=-mu[i];
}
}
}
int main()
{
init();
int T;
int cas=0;
scanf("%d",&T);
while(T--)
{
ll a,b,c,d,k;
scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&k);
if(k==0 || k>b || k>d)
{
printf("Case %d: 0\n",++cas);
continue;
}
ll minn=min(b,d);
ll ans=0;
for(ll i=1;i*k<=minn;i++)
{
ans+=mu[i]*(b/(i*k))*(d/(i*k));
}
ll tmp=0;
for(ll i=1;i*k<=minn;i++)
{
tmp+=mu[i]*(minn/(i*k))*(minn/(i*k));
}
ans-=tmp/2;
printf("Case %d: %lld\n",++cas,ans);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
int a,b,c,d,k;
bool isprime[maxn];
int prime[maxn];
int num;
int mu[maxn];
void init()
{
memset(isprime,false,sizeof isprime);
mu[1]=1;
for(int i=2;i<maxn;i++)
{
if(!isprime[i])
{
prime[num++]=i;
mu[i]=-1;
}
for(int j=0;j<num&&i*prime[j]<maxn;j++)
{
isprime[i*prime[j]]=true;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
else
mu[i*prime[j]]=-mu[i];
}
}
}
int main()
{
int T;
int cas=0;
init();
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
if(k==0||k>b||k>d)
{
printf("Case %d: 0\n",++cas);
continue;
}
if(b>d) swap(b,d);
int m=b/k;
int n=d/k;
long long ans=0;
for(int i=1;i<=m;i++)
{
ans+=(long long)mu[i]*(m/i)*(n/i);
}
long long tmp=0;
for(int i=1;i<=m;i++)
{
tmp+=(long long)mu[i]*(m/i)*(m/i);
}
ans-=tmp/2;
printf("Case %d: %lld\n",++cas,ans);
}
return 0;
}
luogu 2568 https://www.luogu.org/problemnew/lists?name=2568&orderitem=pid&tag=&content=0&type=
#include<bits/stdc++.h>
using namespace std;
#define maxn 10000007
typedef long long ll;
bool isprime[maxn];
ll prime[maxn];
ll mu[maxn];
ll num;
ll n;
void init()
{
memset(isprime,false,sizeof isprime);
num=0;
mu[1]=1;
for(ll i=2;i<maxn;i++)
{
if(!isprime[i])
{
prime[num++]=i;
mu[i]=-1;
}
for(ll j=0;j<num&&i*prime[j]<maxn;j++)
{
isprime[i*prime[j]]=true;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
else
mu[i*prime[j]]=-mu[i];
}
}
}
int main()
{
init();
scanf("%lld",&n);
ll ans=0;
for(ll i=0;prime[i]<=n;i++)
{
ll minn=n/prime[i];
for(ll j=1;j<=minn;j++)
{
ans+=mu[j]*(minn/j)*(minn/j);
}
}
printf("%lld\n",ans);
return 0;
}
hdu2841
#include<bits/stdc++.h>
using namespace std;
#define maxn 100007
typedef long long ll;
ll isprime[maxn];
ll prime[maxn];
ll num;
ll mu[maxn];
void init()
{
memset(isprime,false,sizeof isprime);
mu[1]=1;
for(ll i=2;i<maxn;i++)
{
if(!isprime[i])
{
prime[num++]=i;
mu[i]=-1;
}
for(ll j=0;j<num && i*prime[j]<maxn;j++)
{
isprime[i*prime[j]]=true;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
else
mu[i*prime[j]]=-mu[i];
}
}
}
int main()
{
init();
int T;
scanf("%d",&T);
while(T--)
{
ll m,n;
scanf("%lld%lld",&m,&n);
ll ans=0;
ll minn=min(m,n);
for(ll i=1;i<=minn;i++)
{
ans+=mu[i]*(m/i)*(n/i);
}
printf("%lld\n",ans);
}
return 0;
}
spoj7001https://www.spoj.com/problems/VLATTICE/
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000007
typedef long long ll;
bool isprime[maxn];
ll prime[maxn];
ll num;
ll mu[maxn];
void init()
{
memset(isprime,false,sizeof isprime);
mu[1]=1;
for(ll i=2;i<maxn;i++)
{
if(!isprime[i])
{
prime[num++]=i;
mu[i]=-1;
}
for(ll j=0;j<num && i*prime[j]<maxn;j++)
{
isprime[i*prime[j]]=true;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
else
mu[i*prime[j]]=-mu[i];
}
}
}
int main()
{
int T;
scanf("%d",&T);
init();
while(T--)
{
ll n;
scanf("%lld",&n);
ll ans=3;
for(ll i=1;i<=n;i++)
{
ans+=mu[i]*(n/i)*(n/i)*(n/i+3);
}
printf("%lld\n",ans);
}
return 0;
}
luogu3455
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define maxn 50005
ll isprime[maxn];
ll prime[maxn];
ll num;
ll mu[maxn];
ll sum[maxn];
void init()
{
memset(isprime,false,sizeof isprime);
mu[1]=1;
for(ll i=2;i<maxn;i++)
{
if(!isprime[i])
{
prime[num++]=i;
mu[i]=-1;
}
for(ll j=0;j<num && i*prime[j]<maxn;j++)
{
isprime[i*prime[j]]=true;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
else
mu[i*prime[j]]=-mu[i];
}
}
for(ll i=1;i<maxn;i++)
sum[i]=sum[i-1]+mu[i];
}
int main()
{
init();
int T;
scanf("%d",&T);
while(T--)
{
ll a,b,d;
scanf("%lld%lld%lld",&a,&b,&d);
ll m=a/d;
ll n=b/d;
ll minn=min(m,n);
ll r;
ll ans=0;
for(ll l=1;l<=minn;l=r+1)
{
r=min(m/(m/l),n/(n/l));
ans+=(sum[r]-sum[l-1])*(m/l)*(n/l);
}
printf("%lld\n",ans);
}
return 0;
}
luogu2522
#include<bits/stdc++.h>
using namespace std;
#define maxn 50005
typedef long long ll;
ll isprime[maxn];
ll prime[maxn];
ll num;
ll mu[maxn];
ll sum[maxn];
void init()
{
memset(isprime,false,sizeof isprime);
mu[1]=1;
for(ll i=2;i<maxn;i++)
{
if(!isprime[i])
{
prime[num++]=i;
mu[i]=-1;
}
for(ll j=0;j<num && i*prime[j]<maxn;j++)
{
isprime[i*prime[j]]=true;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
else
mu[i*prime[j]]=-mu[i];
}
}
for(ll i=1;i<maxn;i++)
sum[i]=sum[i-1]+mu[i];
}
ll solve(ll m,ll n,ll k)
{
m=m/k;
n=n/k;
ll minn=min(m,n);
ll ans=0;
ll r=0;
for(ll l=1;l<=minn;l=r+1)
{
r=min(n/(n/l),m/(m/l));
ans+=(sum[r]-sum[l-1])*(m/l)*(n/l);
}
return ans;
}
int main()
{
init();
int t;
scanf("%d",&t);
while(t--)
{
ll a,b,c,d,k;
scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&k);
ll ans=0;
ans=solve(b,d,k)-solve(b,c-1,k)-solve(a-1,d,k)+solve(a-1,c-1,k);
printf("%lld\n",ans);
}
return 0;
}
https://www.luogu.org/recordnew/show/20913910
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000005
int main()
{
int n;
scanf("%d",&n);
int r=0;
long long ans=0;
for(int l=1;l<=n;l=r+1)
{
r=n/(n/l);
ans+=(r-l+1)*(n/l);
}
printf("%lld\n",ans);
return 0;
}
https://www.luogu.org/problemnew/show/P3935
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mod 998244353
ll solve(ll n)
{
ll r=0;
ll ans=0;
for(ll l=1;l<=n;l=r+1)
{
r=n/(n/l);
ans+=(r-l+1)*(n/l);
}
return ans;
}
int main()
{
ll l,r;
scanf("%lld%lld",&l,&r);
ll ans=0;
ans=(solve(r)%mod-solve(l-1)%mod+mod)%mod;
printf("%lld\n",ans);
return 0;
}
https://www.luogu.org/problemnew/solution/P2257
#include<bits/stdc++.h>
using namespace std;
#define maxn 10000000
typedef long long ll;
bool isprime[maxn];
int prime[maxn];
int num;
int mu[maxn];
int sum[maxn];
int lca[maxn];
inline void read(int &x)
{
x=0;
static int p;p=1;
static char c;c=getchar();
while(!isdigit(c)){if(c=='-')p=-1;c=getchar();}
while(isdigit(c)) {x=(x<<1)+(x<<3)+(c-48);c=getchar();}
x*=p;
}
inline void print(long long x)
{
static int cnt;
static int a[15];
cnt=0;
do
{
a[++cnt]=x%10;
x/=10;
}while(x);
for(int i=cnt;i>=1;i--)putchar(a[i]+'0');
puts("");
}
void init()
{
memset(isprime,false,sizeof false);
mu[1]=1;
for(int i=2;i<maxn;i++)
{
if(!isprime[i])
{
prime[num++]=i;
mu[i]=-1;
}
for(int j=0;j<num && i*prime[j]<maxn;j++)
{
isprime[i*prime[j]]=true;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
else
mu[i*prime[j]]=-mu[i];
}
}
for(int i=0;i<num;i++)
for(ll j=1;j*prime[i]<maxn;j++)
lca[j*prime[i]]+=mu[j];
for(int i=1;i<maxn;i++)
sum[i]=sum[i-1]+lca[i];
}
int n,m;
int main()
{
init();
int T;
scanf("%d",&T);
while(T--)
{
read(n);
read(m);
if(n>m) n^=m^=n^=m;
int r=0;
ll ans=0;
for(int l=1;l<=n;l=r+1)
{
r=min(n/(n/l),m/(m/l));
ans+=1LL*(n/l)*(m/l)*(sum[r]-sum[l-1]);
}
print(ans);
}
return 0;
}
https://www.luogu.org/problemnew/show/P3327
题解:https://www.cnblogs.com/peng-ym/p/8667321.html
#include<bits/stdc++.h>
using namespace std;
#define maxn 50005
typedef long long ll;
bool isprime[maxn];
int prime[maxn];
int num;
int mu[maxn];
int sum[maxn];
ll g[maxn];
void init()
{
memset(isprime,false,sizeof isprime);
mu[1]=1;
for(int i=2;i<maxn;i++)
{
if(!isprime[i])
{
prime[num++]=i;
mu[i]=-1;
}
for(int j=0;j<num && i*prime[j]<maxn;j++)
{
isprime[i*prime[j]]=true;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
else
mu[i*prime[j]]=-mu[i];
}
}
for(int i=1;i<maxn;i++)
sum[i]=sum[i-1]+mu[i];
for(int i=1;i<maxn;i++)
{
ll ans=0;
for(int l=1,r;l<=i;l=r+1)
{
r=i/(i/l);
ans+=1ll*(r-l+1)*1ll*(i/l);
}
g[i]=ans;
}
}
int main()
{
init();
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
int minn=min(n,m);
ll ans=0;
for(int l=1,r;l<=minn;l=r+1)
{
r=min(n/(n/l),m/(m/l));
ans+=(sum[r]-sum[l-1])*1ll*g[n/l]*1ll*g[m/l];
}
printf("%lld\n",ans);
}
return 0;
}
P1447 [NOI2010]能量采集 题解
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
bool isprime[maxn];
int prime[maxn];
int phi[maxn];
int n,m;
int num;
long long sum[maxn];
void init()
{
phi[1]=1;
for(int i=2;i<maxn;i++)
{
if(!isprime[i])
{
prime[num++]=i;
phi[i]=i-1;
}
for(int j=0;j<num && i*prime[j]<maxn ;j++)
{
isprime[i*prime[j]]=true;
if(i%prime[j]==0)
{
phi[i*prime[j]]=prime[j]*phi[i];
break;
}
else
phi[i*prime[j]]=(prime[j]-1)*phi[i];
}
}
for(int i=1;i<maxn;i++)
sum[i]=sum[i-1]+phi[i];
}
int main()
{
init();
scanf("%d%d",&n,&m);
if(n>m) swap(n,m);
long long ans=0;
for(int l=1,r;l<=n;l=r+1)
{
r=min(n/(n/l),m/(m/l));
ans+=1ll*(n/l)*(m/l)*(sum[r]-sum[l-1]);
}
ans=2*ans-1ll*n*m;
printf("%lld\n",ans);
return 0;
}