题目链接

我们称“简要题意”给出的三个要求分别为“条件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. python中的分号(“;”)

    在C.Java等语言的语法中规定,必须以分号作为语句结束的标识.Python也支持分号,同样用于一条语句的结束标识.但在Python中分号的作用已经不像C.Java中那么重要了,Python中的分号可 ...

  2. Vue.nextTick DOM 更新循环结束之后执行延迟回调

    在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 简单来说,Vue 在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统 ...

  3. JDBC 预编译语句对象

    Statement的安全问题:Statement的执行其实是直接拼接SQL语句,看成一个整体,然后再一起执行的. String sql = "xxx"; // ? 预先对SQL语句 ...

  4. 拼接 字典序min

    给定一个字符串类型的数组strs,找到一种拼接方式,使得把所有字符串拼起来之后形成的字符串具有最低的字典序. 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个 ...

  5. JavaScript 深度遍历对象的两种方式,递归与非递归

    递归遍历: 基本问题: 当前属性值不为对象时,打印键和值 递归过程:当前属性值为对象时,打印键,继续递归 var o = { a: { b: { c: { d: { e: { f: 1, g:{ h: ...

  6. Cocos纹理理解

    原文:https://blog.csdn.net/u010223072/article/details/78287294 理论要点 要点一: 文件格式与像素格式的区别:文件格式是图像为了存储信息而使用 ...

  7. 2019年7月22日A股科创板开板首日行情思考

    2019年7月22日A股科创板开板首日行情思考 原因:2019科创板开板交易 盘面:科创板交易活跃,首批上市25只股票大涨,最高达5倍涨幅:主板交投低迷,量能萎缩,大部分股票下跌. 操作:加仓 西安银 ...

  8. 显ipQQ

    链接:https://pan.baidu.com/s/1l1WN4b3jT8n4e66DH8d-cg 提取码:kjm4

  9. Python中利用for表达式创建列表

    1.for表达式语法格式及用法 for表达式利用可迭代对象创建新的列表,for表达式也称为列表推导式,具体语法格式如下: [表达式 for 循环计数器 in 可迭代对象] 例: a = [ i + i ...

  10. 【PAT甲级】1067 Sort with Swap(0, i) (25 分)

    题意: 输入一个正整数N(<=100000),接着输入N个正整数(0~N-1的排列).每次操作可以将0和另一个数的位置进行交换,输出最少操作次数使得排列为升序. AAAAAccepted cod ...