题解 nflsoj553 【六校联合训练 省选 #10】飞
我们称“简要题意”给出的三个要求分别为“条件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】飞的更多相关文章
- 题解 nflsoj550 【六校联合训练 省选 #9】序列
题目链接 以下把值域(题面里的\(lim\))记做\(m\). 考虑求\(k\)的答案.考虑每个位置对答案的贡献,枚举位置\(i\),再枚举\(a[i]\)的值\(x\).设: \[ F(k)=\su ...
- NFLSOJ 1072 - 【2021 六校联合训练 NOIP #1】异或(FWT+插值)
题面传送门 一道非常不错的 FWT+插值的题 %%%%%%%%%%%% 还是那句话,反正非六校的看不到题对吧((( 方便起见在下文中设 \(n=2^d\). 首先很明显的一点是这题涉及两个维度:异或和 ...
- NFLSOJ 1060 - 【2021 六校联合训练 NOI #40】白玉楼今天的饭(子集 ln)
由于 NFLSOJ 题面上啥也没有就把题意贴这儿了( 没事儿,反正是上赛季的题,你们非六校学生看了就看了,况且看了你们也没地方交就是了 题意: 给你一张 \(n\) 个点 \(m\) 条边的图 \(G ...
- 题解 nflsoj489 【六校联合训练 CSP #15】小D与随机
题目链接 考虑枚举好点的集合.此时要考虑的问题是如何填入\(1\sim n\)这些数使得恰好我们枚举到的这些点是好点,即:求出有多少种合法的填数方案. \(1\)号点一定是好点.那么除\(1\)号点外 ...
- HDU 5358(2015多校联合训练赛第六场1006) First One (区间合并+常数优化)
pid=5358">HDU 5358 题意: 求∑i=1n∑j=in(⌊log2S(i,j)⌋+1)∗(i+j). 思路: S(i,j) < 10^10 & ...
- 2017多校联合训练2—HDU6054--Is Derek lying?(思维题)
Is Derek lying? Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- hdu 4649 Professor Tian 多校联合训练的题
这题起初没读懂题意,悲剧啊,然后看了题解写完就AC了 题意是给一个N,然后给N+1个整数 接着给N个操作符(只有三种操作 即 或 ,与 ,和异或 | & ^ )这样依次把操作符插入整 ...
- HDU 4643 GSM 暑期多校联合训练第五场 1001
点击打开链接 我就不说官方题解有多坑了 V图那么高端的玩意儿 被精度坑粗翔了 AC前 AC后 简直不敢相信 只能怪自己没注意题目For the distance d1 and d2, if fabs( ...
- 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)
题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...
随机推荐
- Centos610无桌面安装VSFTP
1.检查可以安装的VSFTP版本 yum search vsftp 2.开始安装VSFTP yum install -y vsftpd 3.配置说明 cd /etc/vsftpd vsftpd.con ...
- C:C语言中表示进制数
#include <stdio.h> int main() { int a = 123; //十进制方式赋值 int b = 0123; //八进制方式赋值, 以数字0开头 int c = ...
- 为什么阿里Java手册推荐慎用 Object 的 clone 方法来拷贝对象
图片若无法显示,可至掘金查看https://juejin.im/post/5d425230f265da039519d248 前言 在阿里Java开发手册中,有这么一条建议:慎用 Object 的 cl ...
- 【代码总结】SQL语句设计
1.根据空值(NULL)检索条件 select * from user where age is not null; //查询年龄为null的所有用户 2.使用IN进行范围对比查询 ,5的所有用户 , ...
- python查看包路径及对象的所有方法名
进入python环境: python 输入如下代码: import sys sys.path = sys.path[:] import django print(django.__path__) 得到 ...
- 吴裕雄 python 神经网络——TensorFlow训练神经网络:不使用激活函数
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data INPUT_NODE = 784 ...
- org.springframework.web.multipart.MultipartException: The current request is not a multipart request
今天做图片上传的碰到这个问题,查找原因是html请求的方式问题.from中涉及到图片上传的就要用post提交方式.否则就会报这个错误.如果已经是post的提交方式了还有这个错...还有两种解决方法. ...
- CURL_模拟登录
<?php $curl = curl_init(); $url = "http://www.imooc.com/user/login"; //$url = "htt ...
- Win32 开发记录
Typedefs LPCSTR = char* LPCWSTR = wchar_t* Webpages Control reference: https://docs.microsoft.com/en ...
- nginx 的location的匹配顺序
匹配规则 匹配顺序 示例 [root@python vhast]# cat test.conf server { server_name haha.com; #listen 8080; rewrite ...