Codeforces915 G. Coprime Arrays(莫比乌斯容斥,差分前缀和优化)

Posted live4m

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces915 G. Coprime Arrays(莫比乌斯容斥,差分前缀和优化)相关的知识,希望对你有一定的参考价值。

题意:

解法:

a n s [ x ] = ∑ a 1 = 1 x . . . ∑ a n = 1 x [ g c d ( a 1 , . . . a n ) = = 1 ] 容 斥 , 答 案 为 g c d 为 1 倍 数 的 方 案 数 − . . . + . . . a n s [ x ] = ∑ d = 1 x μ ( d ) ( x d ) n 发 现 有 x / d , 可 以 整 除 分 块 , 单 组 复 杂 度 O ( s q ∗ l o g ) k 组 的 总 复 杂 度 降 为 O ( k ∗ s q ∗ l o g ) , 需 要 继 续 优 化 注 意 到 这 题 需 要 求 出 全 部 的 a n s [ 1 , k ] , 而 x / d 在 x = [ t d , ( t + 1 ) d − 1 ] 是 相 同 的 , 可 以 枚 举 d , 对 a n s [ t d , ( t + 1 ) d − 1 ] + = μ ( d ) ( x d ) n , 枚 举 [ t d , ( t + 1 ) d − 1 ] 的 总 复 杂 度 为 O ( k ∗ l o g ) 差 分 前 缀 和 维 护 a n s [ ] 即 可 . 注 意 到 ( x d ) n 是 需 要 快 速 幂 的 , 因 此 总 复 杂 度 为 O ( k ∗ l o g 2 ) , 由 于 ( x d ) 是 [ 1 , k ] 的 整 数 , 可 以 预 处 理 t n , 将 总 复 杂 度 降 为 O ( k ∗ l o g ) . ans[x]=\\sum_{a_1=1}^x...\\sum_{a_n=1}^x[gcd(a_1,...a_n)==1]\\\\ 容斥,答案为gcd为1倍数的方案数-...+...\\\\ ans[x]=\\sum_{d=1}^x\\mu(d)(\\frac{x}{d})^n\\\\ 发现有x/d,可以整除分块,单组复杂度O(sq*log)\\\\ k组的总复杂度降为O(k*sq*log),需要继续优化\\\\ 注意到这题需要求出全部的ans[1,k],\\\\ 而x/d在x=[td,(t+1)d-1]是相同的,\\\\ 可以枚举d,对ans[td,(t+1)d-1]+=\\mu(d)(\\frac{x}{d})^n,\\\\ 枚举[td,(t+1)d-1]的总复杂度为O(k*log)\\\\ 差分前缀和维护ans[]即可.\\\\ 注意到(\\frac{x}{d})^n是需要快速幂的,因此总复杂度为O(k*log^2),\\\\ 由于(\\frac{x}{d})是[1,k]的整数,可以预处理t^n,将总复杂度降为O(k*log). ans[x]=a1=1x...an=1x[gcd(a1,...an)==1],gcd1...+...ans[x]=d=1xμ(d)(dx)nx/d,,O(sqlog)kO(ksqlog),ans[1,k],x/dx=[td,(t+1)d1],d,ans[td,(t+1)d1]+=μ(d)(dx)n,[td,(t+1)d1]O(klog)ans[].(dx)n,O(klog2),(dx)[1,k],tn,O(klog).

code:

#include<bits/stdc++.h>
// #define SYNC_OFF
#define int long long
#define ll long long
#define ull unsigned long long
//fast-coding
#define ST(x) x.begin()
#define ED(x) x.end()
#define RST(x) x.rbegin()
#define RED(x) x.end()
#define CL(x) x.clear();
#define all(a,n) a+1,a+1+n
#define ff(i,n) for(ll i=1;i<=n;i++)
#define rff(i,n) for(ll i=n;i>=1;i--)
#define fff(i,n) for(ll i=0;i<n;i++)
#define rfff(i,n) for(ll i=n-1;i>=0;i--)
#define SC(x) scanf("%s",x)
#define SL(x) strlen(x)
#define pss(a) push_back(a)
#define ps(a) push(a)
#define SZ(x) (int)x.size()
#define pee puts("");
#define eee putchar(' ');
#define re readdd()
#define pr(a) printtt(a)
int readdd(){int x=0,f=1;char c=getchar();//
while(!isdigit(c)&&c!='-')c=getchar();
if(c=='-')f=-1,c=getchar();
while(isdigit(c))x=x*10+c-'0',c=getchar();
return f*x;}
void printtt(int x){if(x<0)putchar('-'),x=-x;//
if(x>=10)printtt(x/10);putchar(x%10+'0');}
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}//
int ppow(int a,int b,int mod){a%=mod;//
int ans=1%mod;while(b){if(b&1)ans=(long long)ans*a%mod;
a=(long long)a*a%mod;b>>=1;}return ans;}
bool addd(int a,int b){return a>b;}
int lowbit(int x){return x&-x;}
const int dx[4]={0,0,1,-1};
const int dy[4]={1,-1,0,0};
bool isdigit(char c){return c>='0'&&c<='9';}
bool Isprime(int x){
    for(int i=2;i*i<=x;i++)if(x%i==0)return 0;
    return 1;
}
void ac(int x){if(x)puts("YES");else pu

以上是关于Codeforces915 G. Coprime Arrays(莫比乌斯容斥,差分前缀和优化)的主要内容,如果未能解决你的问题,请参考以下文章

Educational Codeforces Round 36 (Rated for Div. 2) G. Coprime Arrays

CF915G Coprime Arrays 莫比乌斯反演差分前缀和

CodeForces 803F Coprime Subsequences 莫比乌斯,容斥

Codeforces G. Ant colony

Codeforces G. Ciel the Commander

CodeForces 915C(DFS_E题)解题报告