【2020五校联考NOIP #4】今天的你依旧闪耀
题意:
对于一个长度为 \(n\)(\(n\) 为偶数)的排列 \(p\),定义一次“变换”后得到的排列 \(p'\) 为:
\(p'_i=\begin{cases}p_{(i+n+1)/2}&&i \nmid 2\\p_{i/2}&&i\mid2\end{cases}\)
设函数 \(f(i)\) (\(i\) 为偶数),如果长度为 \(i\) 的排列 \(p_j=j\) 经过 \(i\) 次变换恰好第一次回到原样,那么返回 \(i\),否则返回 \(0\)。
现在给出一个偶数 \(A\),求 \([2,A]\) 中所有偶数的 \(f\) 的值的和。
\(2 \leq A \leq 10^7\)
不太难的题,简单写写吧。
容易注意到 \(i\) 经过一次变换变为 \(2i \bmod (n+1)\)。
假设 \(1\) 经过 \(k\) 变换恰好回到 \(1\),那么有 \(2^k\equiv1\pmod{n+1}\)
两边同时乘上 \(i\) 得到 \(i2^k\equiv i\pmod{n+1}\)
也就是说如果 \(1\) 经过 \(k\) 变换恰好回到 \(1\),那么排列就会变回原样。
现在我们就变为对于每个 \(i\),判断 \(i\) 是否为最小的满足 \(2^k\equiv1\pmod{i+1}\) 的 \(k\)。
首先根据欧拉定理 \(2^{\varphi(i+1)}\equiv1\pmod{i+1}\),如果 \(i+1\) 不是质数,那么 \(\varphi(i+1)<i\),\(i\) 就不是最小的满足 \(2^k\equiv1\pmod{n+1}\) 的 \(k\)。
进一步观察,如果满足条件的 \(k\) 不是 \(i\),那么 \(k<i\)。将 \(i\) 分解质因数得到 \(p_1^{\alpha_1}\times p_2^{\alpha_2} \times\dots p_l^{\alpha_l}\),\(k\) 一定是 \(\frac{i}{p_1},\frac{i}{p_2},\dots,\frac{i}{p_l}\) 中某个数的约数。故我们只需检查 \(2^{\frac{i}{p_1}},2^{\frac{i}{p_2}},\dots,2^{\frac{i}{p_l}}\) 是否模 \(i+1\) 余 \(1\) 就行了。
由于 \([1,n]\) 质因数个数最多也就 \(8\) 个,所以就算跑满了时间复杂度也不过 \(8\pi(n)\log n\),足以过这道题。
/*
Contest: -
Problem: NFLSOJ 701
Author: tzc_wk
Time: 2020.10.5
*/
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define fz(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define foreach(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++)
#define all(a) a.begin(),a.end()
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,0x3f,sizeof(a))
#define y1 y1010101010101
#define y0 y0101010101010
typedef pair<int,int> pii;
typedef long long ll;
inline int read(){
int x=0,neg=1;char c=getchar();
while(!isdigit(c)){
if(c=='-') neg=-1;
c=getchar();
}
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x*neg;
}
int n=read();
bool vis[10000005];
int pr[10000005],pcnt=0;
int mnp[10000005];
inline ll qpow(ll x,int e,ll MOD){
ll ans=1;
while(e){
if(e&1) ans=ans*x%MOD;
x=x*x%MOD;e>>=1;
}
return ans;
}
inline void prework(int x){
for(int i=2;i<=x;i++){
if(!vis[i]){pr[++pcnt]=i;mnp[i]=i;}
for(int j=1;j<=pcnt&&i*pr[j]<=x;j++){
vis[i*pr[j]]=1;mnp[i*pr[j]]=pr[j];
if(i%pr[j]==0) break;
}
}
}
int main(){
prework(1e7);ll sum=0;
for(int i=2;i<=n;i+=2){
if(vis[i+1]) continue;
bool flag=1;int tmp=i;
vector<int> p;
while(tmp!=1){
int x=mnp[tmp];tmp/=x;
if(p.empty()||p.back()!=x) p.pb(x);
}
for(int j=0;j<p.size();j++) if(qpow(2,i/p[j],i+1)==1) flag=0;
if(flag) sum+=i;
}
printf("%.5lf\n",1.0*sum/(n>>1));
return 0;
}
UPD on \(2020/10/19\):
洛 阳 铲(其实也就两周之前)
关于上文中“\(k\) 一定是 \(\frac{i}{p_1},\frac{i}{p_2},\dots,\frac{i}{p_l}\) 中某个数的约数”一句,一直有些疑惑,故刚刚 yy 了几分钟把它搞通了,今写在这里,以免下次再忘记。
我们假设最小的满足 \(2^k \equiv 1 \pmod{i+1}\) 的 \(k\) 为 \(l\),那么 \(2^{i-l} \equiv 1 \pmod{i+1}\)。
反证法,假设 \(l\) 不是 \(i\) 的约数,那么 \(l \nmid i-l\)。
设 \(i-l=pl+q(q<l)\),那么 \(2^{i-l}=2^{pl+q}=(2^l)^p\times 2^q\equiv 1^p\times 2^q=2^q\equiv 1\pmod{i+1}\)
故 \(2^q \equiv 1\pmod{i+1}\),又 \(q<l\),与我们之前的“\(l\) 是最小的满足 \(2^k \equiv 1 \pmod{i+1}\) 的 \(k\)”矛盾。
故 \(l\) 为 \(i\) 的约数。而 \(l \neq i\),所以 \(l\) 一定是 \(\frac{i}{p_1},\frac{i}{p_2},\dots,\frac{i}{p_l}\) 中某个数的约数。
【2020五校联考NOIP #4】今天的你依旧闪耀的更多相关文章
- 【2020五校联考NOIP #6】三格缩进
题意: 给出 \(n\) 个数 \(a_1,a_2,\dots,a_n\),你要进行 \(m\) 次操作,每次操作有两种类型: \(1\ p\ x\):将 \(a_p\) 改为 \(x\). \(2\ ...
- 【2020五校联考NOIP #8】自闭
题目传送门 题意: 有一个 \(n \times m\) 的矩阵,里面已经填好了 \(k\) 个非负整数. 问是否能在其它 \(n \times m-k\) 个格子里各填上一个非负整数,使得得到的矩阵 ...
- 【2020五校联考NOIP #8】狗
题面传送门 原题题号:Codeforces 883D 题意: 有 \(n\) 个位置,每个位置上要么有一条狗,要么有一根骨头,要么啥都没有. 现在你要给每个狗指定一个方向(朝左或朝右). 朝左的狗可以 ...
- 【2020五校联考NOIP #7】道路扩建
题面传送门 题意: 给出一张 \(n\) 个点 \(m\) 条边的无向图 \(G\),第 \(i\) 条边连接 \(u_i,v_i\) 两个点,权值为 \(w_i\). 你可以进行以下操作一次: 选择 ...
- 【2020五校联考NOIP #3】序列
题面传送门 原题题号:Codeforces Gym 101821B 题意: 给出一个排列 \(p\),要你找出一个最长上升子序列(LIS)和一个最长下降子序列(LDS),满足它们没有公共元素.或告知无 ...
- 【2020五校联考NOIP #7】伟大的卫国战争
题面传送门 题意: 数轴上有 \(n\) 个点,现在要在它们之间连 \(m\) 条边,第 \(i\) 条边连接 \(a_i,b_i\) 两个点. 现在你要钦定每条边连在数轴的上方还是下方,使得任意两条 ...
- 【2020五校联考NOIP #6】最佳观影
题意: 给出一个 \(k \times k\) 的网格和 \(n\) 次操作.其中 \(k\) 为奇数. 每次操作给出一个数 \(m\).每次你要找出一个三元组 \((x,l,r)\) 使得: \(r ...
- 【2020五校联考NOIP #2】矩阵
咕咕咕到现在~ 题面传送门 题意: 给出一个 \(n\times n\) 的矩阵 \(A\).要你求有多少个 \(n\times n\) 的矩阵 \(B\) 满足: 每一行都是 \(1\) 到 \(n ...
- 【五校联考1day2】JZOJ2020年8月12日提高组T2 我想大声告诉你
[五校联考1day2]JZOJ2020年8月12日提高组T2 我想大声告诉你 题目 Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一 ...
随机推荐
- 如何配置log4Net
之前曾经用过几次,但是每次都是用完就忘了,下次再用的时候要baidu半天,这次弄通之后直接记下来. 步骤如下. 1. 安装log4Net,直接用NuGet, Install-Package log4N ...
- 欧姆龙plc通讯协议格式
欧姆龙CPM1A型plc与上位计算机通信的顺序是上位机先发出命令信息给PLC,PLC返回响应信息给上位 机.每次通信发送/接受的一组数据称为一"帧".帧由少于131个字符的数据构成 ...
- BUAA 2020 软件工程 热身作业
BUAA 2020 软件工程 热身作业 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第一次作业-热身! ...
- gson中TypeAdapter实现自定义序列化操作
最近在项目中遇到这么一个问题,我们后台需要向前端返回一个 json 数据,就是将一个地理位置对象以json的格式返回到前台,但是这个地理位置对象中的经纬度是Double数据类型,项目中规定,如果经纬度 ...
- 深入理解xLua基于IL代码注入的热更新原理
目前大部分手游都会采用热更新来解决应用商店审核周期长,无法满足快节奏迭代的问题.另外热更新能够有效降低版本升级所需的资源大小,节省玩家的时间和流量,这也使其成为移动游戏的主流更新方式之一. 热更新可以 ...
- 攻防世界 杂项 11.simple_transfer
题目描述: 文件里有flag,找到它. 题目分析: 文件解压后是一个抓包流量分析文件,用 wireshark 打开后,用分组字节流搜索 flag,追踪 TCP 流,可以隐约看到有 file.pdf, ...
- MVC下垃框的使用
--------------模型-------------------- /// <summary> /// 状态 /// =0 下架 =1 上架 /// </summary> ...
- poj 2960 S-Nim (SG)
题意: K个数,s1...sk. m个状态,对于某一个状态,有L堆石子,每人每次取的石子个数只能是s1...sk的一个,且只能在一堆中取. 输出m个状态是先手胜还是先手败,先手胜输出W,否则输出L. ...
- DeWeb第2个通用化模块:主控模块。 手机/电脑自适应。通过修改配置文件即可实现进入不同模块
演示: https://delphibbs.com/main.dw 也可以通过 https://delphibbs.com/login.dw 采用admin/123456登录后自动进入 开发环境和源代 ...
- 西邮Linux兴趣小组第一次技术分享会
2016年10月30日晚,西邮Linux兴趣小组技术分享会在西安邮电大学长安校区东区逸夫教学楼FF305室成功举办.200多名来自全校不同专业的15,16级同学参加了此次分享会. 分享会于20:00正 ...