题目链接

我们称“简要题意”给出的三个要求分别为“条件1”,“条件2”,“条件3”。

条件3长得比较丑,考虑转化一下。把不等式两边同时开\(ij\)次根,得到:\(\sqrt[i]{x_i}<\sqrt[j]{x_j+1}\)。这样左边只和\(i\)有关,右边只和\(j\)有关。于是条件3就转化为了\((\max_{i=1}^{n}\sqrt[i]{x_i})<(\min_{i=1}^{n}\sqrt[i]{x_i+1})\)。

根据转化后的条件3,加上条件1(\(x_1=2\)),我们可以推出:\(2^i\leq x_i<3^i\)。

再考虑条件2。我们发现:如果条件2不成立,则条件3和条件1不可能同时成立。证明:

首先,如果存在一对\(i<j\),且\(x_i>x_j\)。则\(x_j+1\leq x_i\),即\(\sqrt[j]{x_j+1}<\sqrt[i]{x_i}\),不满足我们转化后的条件3。

再考虑如果序列非严格递增,即存在\(x_i=x_{i+1}\)。设\(x_i=a\),若条件3成立,则\(a^{i+1}<(a+1)^i\)。两边同时除以\(a^i\)得\(a<\left(\frac{a+1}{a}\right)^i\)。若条件1成立,则\(a\geq 2^i\)。即\(\left(\frac{a+1}{a}\right)^i>2^i\),\(\frac{a+1}{a}>2\),\(a<1\)。与\(2^i\leq a<3^i\)矛盾。故不可能在条件2不成立时,让条件1和条件3同时成立。

所以,当条件1和条件3同时成立时,条件2也一定成立。于是我们接下来可以不考虑条件2。

因为对每个\(x_i\),\(2^i\leq x_i<3^i\),我们考虑每个\(x_i\)的所有可能的取值,把所有取值对应的\(\sqrt[i]{x_i}\)和\(\sqrt[i]{x_i+1}\)都求出来。将所有可能的\(\sqrt[i]{x_i}\)和\(\sqrt[i]{x_i+1}\)的值放在一起,排序并去重。

我们称排序去重后,相邻的两个值之间的区间为一段小区间。可以发现:所有小区间和所有合法序列一一对应。即:小区间的数量就是本题的答案!证明:

考虑一个合法的序列的\([(\max_{i=1}^{n}\sqrt[i]{x_i}),(\min_{i=1}^{n}\sqrt[i]{x_i+1})]\)这个区间。

如果我们选择一段小区间\([l,r]\)作为这个\([\max,\min]\)的区间。对每个位置\(i\),考虑它的所有可能的\(x_i\)的值,一定存在唯一的一个值\(a(2^i\leq a<3^i)\),使得\(\sqrt[i]{a}\leq l\)且\(\sqrt[i]{a+1}\geq r\)。我们令\(x_i=a\)。这样,我们就构造出了一个合法的序列。即对于每段小区间,我们都能构造出一个合法的序列

考虑如果\(x_i<a\),则会使得\(\sqrt[i]{x_i+1}<r\);如果\(x_i>a\),则会使得\(\sqrt[i]{x_i}>l\),这都不符合要求。因此,每段小区间\([l,r]\)只会唯一对应一个合法的序列(就是我们构造出的那个)。

考虑如果某个序列的\([\max,\min]\)这个区间不是一段小区间,即它中间跨过了至少一个点。假设这个点属于\(x_j\)。则\(x_j\)就无法找到一个取值,使得\(\sqrt[j]{x_j}\leq l\)且\(\sqrt[j]{x_j+1}\geq r\)。因此,不存在某个合法序列的\([\max,\min]\)不是一段小区间。所以:每个合法序列,都唯一对应一段小区间

问题转化为如何求出小区间的数量。

依次考虑所有\(i\in[2,n]\)。设\(f(i)\)表示\(i\)这个位置会新增多少点。则
\[
f(i)=3^i-2^i-\sum_{d|i,d<i}f(d)
\]
移项得:
\[
\sum_{d|i}f(d)=3^i-2^i
\]
设\(g(i)=3^i-2^i\),则\(g(i)=\sum_{d|i}f(d)\)。根据莫比乌斯反演,有:
\[
f(i)=\sum_{d|i}\mu(\frac{i}{d})g(d)
\]
我们要求的是:
\[
\begin{align}
ans=&\sum_{i=1}^{n}f(i)\\
=&\sum_{i=1}^{n}\sum_{d|i}\mu(\frac{i}{d})g(d)\\
=&\sum_{d=1}^{n}g(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\mu(i)
\end{align}
\]
用数论分块+杜教筛(记忆化),可以在\(O(n^\frac{2}{3})\)时间内求出\(ans\)。

参考代码:

//problem:nflsoj553
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define mk make_pair
#define lob lower_bound
#define upb upper_bound
#define fst first
#define scd second

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;

/*  ------  by:duyi  ------  */ // dysyn1314
const int MAXN=1e7;
ll n;int MOD,PHIMOD,INV2;
inline int mod1(int x){return x<MOD?x:x-MOD;}
inline int mod2(int x){return x<0?x+MOD:x;}
inline void add(int &x,int y){x=mod1(x+y);}
inline void sub(int &x,int y){x=mod2(x-y);}
inline int pow_mod(int x,int i){int y=1;while(i){if(i&1)y=(ll)y*x%MOD;x=(ll)x*x%MOD;i>>=1;}return y;}
int p[MAXN/10],cnt,mu[MAXN+5];
bool v[MAXN+5];
void sieve(){
    mu[1]=1;
    for(int i=2;i<=MAXN;++i){
        if(!v[i])p[++cnt]=i,mu[i]=-1;
        for(int j=1;j<=cnt&&(ll)i*p[j]<=MAXN;++j){
            v[i*p[j]]=1;
            if(i%p[j]==0)break;
            mu[i*p[j]]=-mu[i];
        }
    }
    //cerr<<cnt<<endl;
    for(int i=1;i<=MAXN;++i)mu[i]+=mu[i-1],mu[i]=mod2(mu[i]);
}
map<ll,int>mp;
int summu(ll n){
    if(n<=MAXN)return mu[n];
    if(mp.count(n))return mp[n];
    int res=1;
    for(ll i=2,j;i<=n;i=j+1){
        j=n/(n/i);
        sub(res,(ll)(j-i+1)*summu(n/i)%MOD);
    }
    return mp[n]=res;
}
int sumg(ll n){
    if(!n)return 0;
    return mod2((ll)mod2(pow_mod(3,(n+1)%PHIMOD)-3)*INV2%MOD-mod2(pow_mod(2,(n+1)%PHIMOD)-2));
}
int main() {
    cin>>n>>MOD;PHIMOD=MOD-1;INV2=pow_mod(2,MOD-2);
    sieve();
    int ans=0;
    for(ll i=1,j;i<=n;i=j+1){
        j=n/(n/i);
        add(ans,(ll)mod2(sumg(j)-sumg(i-1))*summu(n/i)%MOD);
    }
    cout<<ans<<endl;
    return 0;
}

题解 nflsoj553 【六校联合训练 省选 #10】飞的更多相关文章

  1. 题解 nflsoj550 【六校联合训练 省选 #9】序列

    题目链接 以下把值域(题面里的\(lim\))记做\(m\). 考虑求\(k\)的答案.考虑每个位置对答案的贡献,枚举位置\(i\),再枚举\(a[i]\)的值\(x\).设: \[ F(k)=\su ...

  2. NFLSOJ 1072 - 【2021 六校联合训练 NOIP #1】异或(FWT+插值)

    题面传送门 一道非常不错的 FWT+插值的题 %%%%%%%%%%%% 还是那句话,反正非六校的看不到题对吧((( 方便起见在下文中设 \(n=2^d\). 首先很明显的一点是这题涉及两个维度:异或和 ...

  3. NFLSOJ 1060 - 【2021 六校联合训练 NOI #40】白玉楼今天的饭(子集 ln)

    由于 NFLSOJ 题面上啥也没有就把题意贴这儿了( 没事儿,反正是上赛季的题,你们非六校学生看了就看了,况且看了你们也没地方交就是了 题意: 给你一张 \(n\) 个点 \(m\) 条边的图 \(G ...

  4. 题解 nflsoj489 【六校联合训练 CSP #15】小D与随机

    题目链接 考虑枚举好点的集合.此时要考虑的问题是如何填入\(1\sim n\)这些数使得恰好我们枚举到的这些点是好点,即:求出有多少种合法的填数方案. \(1\)号点一定是好点.那么除\(1\)号点外 ...

  5. HDU 5358(2015多校联合训练赛第六场1006) First One (区间合并+常数优化)

    pid=5358">HDU 5358 题意: 求∑​i=1​n​​∑​j=i​n​​(⌊log​2​​S(i,j)⌋+1)∗(i+j). 思路: S(i,j) < 10^10 & ...

  6. 2017多校联合训练2—HDU6054--Is Derek lying?(思维题)

    Is Derek lying? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  7. hdu 4649 Professor Tian 多校联合训练的题

    这题起初没读懂题意,悲剧啊,然后看了题解写完就AC了 题意是给一个N,然后给N+1个整数 接着给N个操作符(只有三种操作  即  或 ,与 ,和异或 |   &  ^ )这样依次把操作符插入整 ...

  8. HDU 4643 GSM 暑期多校联合训练第五场 1001

    点击打开链接 我就不说官方题解有多坑了 V图那么高端的玩意儿 被精度坑粗翔了 AC前 AC后 简直不敢相信 只能怪自己没注意题目For the distance d1 and d2, if fabs( ...

  9. 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)

    题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...

随机推荐

  1. phpRedis函数使用总结【分类详细】

    <?php /*1.Connection*/ $redis = new Redis(); $redis->connect('127.0.0.1',6379,1);//短链接,本地host, ...

  2. Net Core解决ZipFile解压中文出现乱码

    一.在main方法中添加 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); 二.解压添加 //sourceArchiveFi ...

  3. idea新建项目相关名词意义

    新建项目中的对比 建完之后的项目对比 对比 新建中Artifact的名称对应maven中名字 新建中package的名字对应的是项目中src下package名字 新建中project name的名字对 ...

  4. js中substr、substring、indexOf、lastIndexOf的用法

    substr substr(start,length)表示从start位置开始,截取length长度的字符串 var str="imgs/header_2.jpg"; consol ...

  5. java 日志的数据脱敏

    思路 1.在 model层进行处理,直接重写get方法,在写一个getPlain 获取明文方法.(缺点:数据库写入和json序列化传递时使用的都是密文) 2.利用 日志组件过滤 特定的key,去进行脱 ...

  6. 抽取JDBC工具类

    package com.wbytts.util; import java.io.IOException; import java.io.InputStream; import java.sql.Con ...

  7. CSS样式的引入&区别&权重&CSS层叠性&CSS样式的来源

    CSS样式的引入: 内部样式: 内部样式:写在当前页面style标签中的样式 内联样式:写在style属性中的样式 外部样式: link标签引入的CSS文件 @import引入的CSS文件,需要写在c ...

  8. node vue 项目git 管理

    push 上传到云的时候,依赖包及相关文件是不上传上去的, 所以每次克隆到本地后,node 项目运行前须要 npm install 安装对应依赖 vue 项目编译前也须要  npm install,安 ...

  9. centos无法启动之fstab

    你可能由于对磁盘管理,修改了/etc/fstab文件,进行自动挂载,但是卸载磁盘后,忘记修改/etc/fstab文件,导致了如下启动linux错误,开启进入紧急模式 error getting aut ...

  10. 一个简单insert 语句执行 40ms 原因剖析

    背景:一个简单的带有主键的insert 语句,居然要 40ms ,开发受不了,要求降低 因此我们要关注的的 数据从插入落地的IO 中间都干了什么 一.MySQL的文件 首先简单介绍一下MySQL的数据 ...