首页 > 其他分享 >题解:CF915G Coprime Arrays

题解:CF915G Coprime Arrays

时间:2024-08-30 20:36:31浏览次数:9  
标签:lfloor right frac Arrays 题解 sum rfloor Coprime left

题意

我们称一个大小为 \(n\) 的数组 \(a\) 互质,当且仅当 \(\gcd(a_1,a_2,\cdots,a_n)=1\)。

给定 \(n,k\),对于每个 \(i\) \((1\le i\le k)\),你都需要确定这样的数组的个数——长度为 \(n\) 的互质数组 \(a\) ,满足对每个 \(j\) \((1\le j\le n)\),都有 \(1\le a_j\le i\)。

分析

我们设 \(f(x)\) 为 \(x\) 所对应的互质数组的个数。

按照题意,可以列出这样一个式子:

\[f(x)=\sum^x_{a_1=1}\sum^x_{a_2=1}\cdots\sum^x_{a_n=1}\left[\gcd^n_{i=1}a_i=1\right] \]

简单推一下式子:

\[\begin{aligned} f(x)&=\sum^x_{a_1=1}\sum^x_{a_2=1}\cdots\sum^x_{a_n=1}\left[\gcd^n_{i=1}a_i=1\right]\\ &=\sum^x_{a_1=1}\sum^x_{a_2=1}\cdots\sum^x_{a_n=1}\varepsilon\left(\gcd^n_{i=1}a_i\right)\\ \end{aligned} \]

因为 \(\mu*\mathbf{1}=\varepsilon\),即 \(\varepsilon(x)=\sum_{d|x}\mu(d)\) 所以有:

\[\begin{aligned} f(x)&=\sum^x_{a_1=1}\sum^x_{a_2=1}\cdots\sum^x_{a_n=1}\sum_{d|\gcd^n_{i=1}a_i}\mu(d)\\ &=\sum^x_{a_1=1}\sum^x_{a_2=1}\cdots\sum^x_{a_n=1}\sum_{d|a_1,\cdots,d|a_n}\mu(d)\\ \end{aligned} \]

变换求值顺序,枚举 \(d\):

\[\begin{aligned} f(x)&=\sum^x_{d=1}\mu(d)\sum^{\lfloor\frac{x}{d}\rfloor}_{a_1=1}\sum^{\lfloor\frac{x}{d}\rfloor}_{a_2=1}\cdots\sum^{\lfloor\frac{x}{d}\rfloor}_{a_n=1}1\\ &=\sum^x_{d=1}\mu(d)\left\lfloor\frac{x}{d}\right\rfloor^n \end{aligned} \]

于是我们得到了一个 \(O(k\sqrt{k}+k\log n)\) 的做法。

在 \(n,k\leq2\times10^6\) 的规模下,无法通过本题。


有个显然的引理:

\[d|x \Leftrightarrow \left\lfloor\frac{x}{d}\right\rfloor = \left\lfloor\frac{x-1}{d}\right\rfloor+1 \]

据此考虑差分:

\[\begin{aligned} \Delta f(x)&=f(x)-f(x-1)\\ &=\sum^x_{d=1}\mu(d)\left\lfloor\frac{x}{d}\right\rfloor^n-\sum^{x-1}_{d=1}\mu(d)\left\lfloor\frac{x-1}{d}\right\rfloor^n\\ &=\sum^x_{d=1}\mu(d)\left(\left\lfloor\frac{x}{d}\right\rfloor^n-\left\lfloor\frac{x-1}{d}\right\rfloor^n\right)\\ \end{aligned} \]

根据上述引理,当且仅当 \(d|x\) 时 \(\left(\left\lfloor\frac{x}{d}\right\rfloor^n-\left\lfloor\frac{x-1}{d}\right\rfloor^n\right) \neq 0\),所以上式可以如下改写:

\[\begin{aligned} \Delta f(x)&=\sum_{d|x}\mu(d)\left(\left\lfloor\frac{x}{d}\right\rfloor^n-\left\lfloor\frac{x-1}{d}\right\rfloor^n\right)\\ \end{aligned} \]

所以,我们可以枚举 \(d\),然后将所有满足 \(d|x\) 的 \(\Delta f(x)\) 加上 \(\mu(d)\left(\left\lfloor\frac{x}{d}\right\rfloor^n-\left\lfloor\frac{x-1}{d}\right\rfloor^n\right)\)。

通过前缀和统计答案。

时间复杂度 \(O(k\log n+k \log k)\)。

Code

#include<bits/stdc++.h>
using namespace std;
#define maxn 2000006
#define mod 1000000007

int mu[maxn];
bool vis[maxn];
vector<int> pri;
void init()
{
    mu[1]=1;
    for(int i=2;i<maxn;i++)
    {
        if(!vis[i]) mu[i]=-1, vis[i]=1, pri.emplace_back(i);
        for(auto p:pri)
        {
            if(p*i>=maxn) break;
            vis[p*i]=1;
            if(i%p==0) break;
            mu[i*p]=-mu[i];
        }
    }
}

int ksm(int64_t x, int l)
{
    int64_t ret=1;
    for(;l;l>>=1, x=x*x%mod)
        if(l&1) ret=ret*x%mod;
    return ret;
}

int lev[maxn], det[maxn];

int main()
{
    int n, k;
    cin>>n>>k;
    init();
    for(int i=1;i<=k;i++) 
        lev[i]=ksm(i, n);
    for(int d=1;d<=k;d++)
        for(int j=1;d*j<=k;j++)
            det[d*j]=((det[d*j]+mu[d]*(mod+(lev[j]-lev[j-1])%mod)%mod)%mod+mod)%mod;
    int ans=0, otp=0;
    for(int i=1;i<=k;i++) 
        otp=(otp+(i^(ans=(ans+det[i])%mod)))%mod;
    cout<<otp%mod;
}

标签:lfloor,right,frac,Arrays,题解,sum,rfloor,Coprime,left
From: https://www.cnblogs.com/redacted-area/p/18389462

相关文章

  • [COCI2012-2013#2] INFORMACIJE 题解
    前言题目链接:洛谷。题意简述你需要构造一个\(1\simn\)的排列\(a\),满足\(m\)个条件,格式如下:1xyv:\(\max\limits_{i=l}^ra_i=v\)。2xyv:\(\min\limits_{i=l}^ra_i=v\)。题目分析首先这个最值很难受,考虑能不能转化成我们喜欢的二元关系......
  • Luogu P10997 Partition 题解 [ 蓝 ] [ 轮廓 dp ]
    Partition:一道dp神题,用到了以轮廓线的轨迹来做dp的技巧,和敲砖块这题的状态设计有点相似。观察首先观察样例,发现整张图可以看作是被两条线分隔开的。同时每个颜色的四个方向上又存在一大堆奇怪的性质,很容易发现这两条线一条是从左上到右下的线,另一条是从右下到左上的线。暴......
  • CF603E 题解
    题意给定一个\(n\)个结点的无向图,初始没有边。接下来有\(m\)个询问,每次向图中加入一条连接\((u,v)\)权值为\(w\)的边。每次加边后,查询是否存在一个边集\(E\),满足当图中只有\(E\)中的边时,所有点的度数均为奇数。同时你还要最小化\(\max\limits_{(u,v,w)\inE}......
  • 【Mysql】mysql count主键字段很慢超时 执行计划Select tables optimized away ,最终调
     背景: mysql表 主键字段count,速度很慢,耗时将近30s   从执行计划可以看出:explainSELECTCOUNT(rule_id)ASdataCountFROM`sku_safe_stock_rule`;   原理分析:SelecttablesoptimizedawaySELECT操作已经优化到不能再优化了(MySQL根本没有遍历......
  • CF891E Lust 题解
    题目链接点击打开链接题目解法会不了\(egf\)/ll我们把贡献变成\(\prod\limits_{j\neqi}a_j=\prod\limits_{j=1}^na_j-\prod\limits_{j=1}^n(a_i-[i=j])\)即答案为一开始的乘积\(-\)\(k\)次操作之后所有数乘积的期望因为有顺序,所以用\(egf\)的形式表示最后乘积的期......
  • UVA12421 (Jiandan) Mua (I) - Lexical Analyzer题解
    没什么废话、超级珂爱的大模拟。本蒟蒻写了2h才过。其实就是按题意模拟即可,不需要什么高深的算法。本人就是错在了符号中的“=”,因为如果是连续的两个等于号,只能输出“==”,而不能输出“=”“==”,然后本人就卡在这个地方卡了1.5h。代码量也不大,主要是毒瘤细节模拟题。......
  • P6192 【模板】最小斯坦纳树 题解
    Description给定一个包含\(n\)个结点和\(m\)条带权边的无向连通图\(G=(V,E)\)。再给定包含\(k\)个结点的点集\(S\),选出\(G\)的子图\(G'=(V',E')\),使得:\(S\subseteqV'\);\(G'\)为连通图;\(E'\)中所有边的权值和最小。你只需要求出\(E'\)中所有边的权值......
  • BZOJ 4403序列统计题解
    缅怀zxc......
  • CSP-J 2021 初赛试题解析(第三部分:完善程序(2))
    完善程序二完整程序代码#include<iostream>usingnamespacestd;structpoint{intx,y,id;};boolequals(pointa,pointb){returna.x==b.x&&a.y==b.y;}boolcmp(pointa,pointb){returna.x!=b.x?a.x<b.x:a.y<b.y;}......
  • AT_arc170_b 的题解
    (一)因为\(a_i\)较小,那么可以对每一个\(i\),求出它右边离他最近的值为\(j\)的位置。枚举左端点和中间那个数\(a_j\),那么可以求出最小的\(k\)。这样就求出了每个左端点可以取到的最小的\(k\),记为\(b_i\)再从右到左\(b_i=\min(b_i,b_{i+1})\)。(二)AC代码。#include<bi......