题面传送门

题意:

对于一个长度为 \(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】今天的你依旧闪耀的更多相关文章

  1. 【2020五校联考NOIP #6】三格缩进

    题意: 给出 \(n\) 个数 \(a_1,a_2,\dots,a_n\),你要进行 \(m\) 次操作,每次操作有两种类型: \(1\ p\ x\):将 \(a_p\) 改为 \(x\). \(2\ ...

  2. 【2020五校联考NOIP #8】自闭

    题目传送门 题意: 有一个 \(n \times m\) 的矩阵,里面已经填好了 \(k\) 个非负整数. 问是否能在其它 \(n \times m-k\) 个格子里各填上一个非负整数,使得得到的矩阵 ...

  3. 【2020五校联考NOIP #8】狗

    题面传送门 原题题号:Codeforces 883D 题意: 有 \(n\) 个位置,每个位置上要么有一条狗,要么有一根骨头,要么啥都没有. 现在你要给每个狗指定一个方向(朝左或朝右). 朝左的狗可以 ...

  4. 【2020五校联考NOIP #7】道路扩建

    题面传送门 题意: 给出一张 \(n\) 个点 \(m\) 条边的无向图 \(G\),第 \(i\) 条边连接 \(u_i,v_i\) 两个点,权值为 \(w_i\). 你可以进行以下操作一次: 选择 ...

  5. 【2020五校联考NOIP #3】序列

    题面传送门 原题题号:Codeforces Gym 101821B 题意: 给出一个排列 \(p\),要你找出一个最长上升子序列(LIS)和一个最长下降子序列(LDS),满足它们没有公共元素.或告知无 ...

  6. 【2020五校联考NOIP #7】伟大的卫国战争

    题面传送门 题意: 数轴上有 \(n\) 个点,现在要在它们之间连 \(m\) 条边,第 \(i\) 条边连接 \(a_i,b_i\) 两个点. 现在你要钦定每条边连在数轴的上方还是下方,使得任意两条 ...

  7. 【2020五校联考NOIP #6】最佳观影

    题意: 给出一个 \(k \times k\) 的网格和 \(n\) 次操作.其中 \(k\) 为奇数. 每次操作给出一个数 \(m\).每次你要找出一个三元组 \((x,l,r)\) 使得: \(r ...

  8. 【2020五校联考NOIP #2】矩阵

    咕咕咕到现在~ 题面传送门 题意: 给出一个 \(n\times n\) 的矩阵 \(A\).要你求有多少个 \(n\times n\) 的矩阵 \(B\) 满足: 每一行都是 \(1\) 到 \(n ...

  9. 【五校联考1day2】JZOJ2020年8月12日提高组T2 我想大声告诉你

    [五校联考1day2]JZOJ2020年8月12日提高组T2 我想大声告诉你 题目 Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一 ...

随机推荐

  1. python的函数参数传递方式

    python的一切数据类型都是对象.但是python的对象分为不可变对象和可变对象.python的变量是引用,对python变量的赋值是引用去绑定该对象. 可变对象的数据发生改变,例如列表和字典,引用 ...

  2. oo第三次博客-JML规格

    这三周的作业主要是围绕以JML来约束代码开发,以确保程序的正确性与鲁棒性. Part 1:三次作业的实现与bug 第一次作业没有任何算法和数据结构上的难度,对于Path和PathContainer的各 ...

  3. Python爬虫之爬取淘女郎照片示例详解

    这篇文章主要介绍了Python爬虫之爬取淘女郎照片示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 本篇目标 抓取淘宝MM ...

  4. 单片机STM32的5个时钟源知识

    众所周知STM32有5个时钟源HSI.HSE.LSI.LSE.PLL,其实他只有四个,因为从上图中可以看到PLL都是由HSI或HSE提供的. 其中,高速时钟(HSE和HSI)提供给芯片主体的主时钟.低 ...

  5. OSI参考模型(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/104589085 学习课程:<2019王道考研计算机网络> 学习目的 ...

  6. nvidia-msi命令解读

    nvidia-msi 或者 watch -n 1 nvidia-smi 打印出表格中: 第一栏的Fan:N/A是风扇转速,从0到100%之间变动,这个速度是计算机期望的风扇转速,实际情况下如果风扇堵转 ...

  7. 021中国大学生程序设计竞赛(CCPC)- 压力测试赛题解

    A.Matrix 挺狗的一道题,从开始冲到最后都没冲出来,都没啥思路. 其实分开考虑每个数的贡献,这个想法也存在过,就是不知道该怎么计算,我们考虑我们单独考虑一个数字\(i(1\leq i\leq n ...

  8. hdu 2830 Matrix Swapping II(额,,排序?)

    题意: N*M的矩阵,每个格中不是0就是1. 可以任意交换某两列.最后得到一个新矩阵. 问可以得到的最大的子矩形面积是多少(这个子矩形必须全是1). 思路: 先统计,a[i][j]记录从第i行第j列格 ...

  9. 第08课 OpenGL 混合

    混合: 在这一课里,我们在纹理的基础上加上了混合,它看起具有透明的效果,当然解释它不是那么容易,当希望你喜欢它. 简单的透明OpenGL中的绝大多数特效都与某些类型的(色彩)混合有关.混色的定义为,将 ...

  10. connect & send 在三次握手过程中的有趣问题

    一.问题回顾 面试的时候被问到的问题,原问题是: 1:写一下socket网络编程服务端和客户端常用的函数. 2:如果服务端在listen之后没有accept,那客户端的connect会返回吗?为什么? ...