题面传送门

题意:

对于一个长度为 \(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三大器——迭代器、生成器、装饰器

    迭代器 聊迭代器前我们要先清楚迭代的概念:通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值). 可迭代对象(i ...

  2. 浅尝装饰器-@staticmethod 和@classmethod

    [写在前面] 本帖归属于装饰器单元的学习,可以点击关键词'装饰器'查看其他博文讲解 [正文部分] 说到装饰器一开始我觉得很陌生,看了一下别人的博客讲解,原来以前学习遇到的静态方法@staticmeth ...

  3. Egg.js学习与实战系列 · 文件上传配置

    在使用Egg.js搭建文件上传服务时,遇到了几个一般新手都会遇到的坑. 经查阅官方文档,Egg框架中默认使用egg-multipart插件进行文件上传,所以上传文件前需要做相关的配置. 上传文件提示: ...

  4. python基础语法--字典的遍历

    原文链接:https://blog.csdn.net/normang/article/details/55804231 (1)遍历key值 >>> a {'a': '1', 'b': ...

  5. 洛谷 P5665 [CSP-S2019] 划分

    链接: P5665 题意: 给出 \(n\) 个整数 \(a_i\) ,你需要找到一些分界点 \(1 \leq k_1 \lt k_2 \lt \cdots \lt k_p \lt n\),使得 \( ...

  6. 视频编码GOP

    GOP group of pictures GOP 指的就是两个I帧之间的间隔. 比较说GOP为120,如果是720 p60 的话,那就是2s一次I帧. 在视频编码序列中,主要有三种编码帧:I帧.P帧 ...

  7. Luogu P1023 [NOIp2000提高组]税收与补贴问题 | 数学

    题目链接 思路:列不等式组,然后解出不等式,得出答案的取值范围,最后取一个绝对值最小的答案就行了. #include<iostream> #include<cstdio> #i ...

  8. cf17A Noldbach problem(额,,,素数,,,)

    题意: 判断从[2,N]中是否有超过[包括]K个数满足:等于一加两个相邻的素数. 思路: 枚举. 也可以:筛完素数,枚举素数,直到相邻素数和超过N.统计个数 代码: int n,k; int prim ...

  9. python的分支结构

    python分支结构 if结构 python的 if 选择分支结构的基础语法如下,需要注意的是判断条件后面是半角的分号,它的作用相当于Java中的小括号 if 判断条件 : 代码块 elif 判断条件 ...

  10. 2020 ICPC 沈阳站 I - Rise of Shadows 题解

    题面看这里 \(PS\):符号 \([\ \rm P\ ]\) 的意义是:当表达式 \(\rm P\) 为真则取值为 \(1\),为假则取值为 \(0\). 题目大意 给你一个一天有 \(H\)​​​ ...