都要考省选了大脑还在这里下线

场上看到这道题很快推出了 \(k\) 为奇数的搞法,发现可以直接做到 \(O(k\log n)\),一阵狂喜然后肝起了 E3,结果 E1 都没过。

事实上这道题可以直接做到 \(O(\log n)\),不过需要细致的观察自己场上推的式子。

题意:

对长度为 \(n\),值域为 \([0,k)\) 的整数数组 \(a\) 计数,要求 \(a\) 满足 \(\exists i\in [1,n],\sum_{j\neq i} a_j\equiv a_i\pmod k\)。

思路:

这道题的分析频繁用到了一次同余方程式的有解性分析,也就是说对于 \(a\equiv b \pmod k\),当 \(\gcd(a,k)|b\) 时有 \(\gcd(a,k)\) 个解,否则无解。

显然可以先枚举一波 \(sum=(\sum_{i=1}^n a_i) \bmod k\),那么题目的条件相当于 \(\exists i\in [1,n],2a_i\equiv sum \pmod k\)。

\(k\) 是奇数时上述方程始终有唯一解,题目的限制相当于强制 \(\frac{sum}{2}\) 必须出现。

考虑计数强制 \(x=\frac{sum}{2}\) 必须出现,然后对着这个限制上容斥,钦定 \(x\) 至少出现了 \(i\) 次。

剩下的部分如果 \(n-i>0\),那么通过调整最后一个数的取值总可以满足 \(\sum_{i=1}^n a_i \equiv sum \pmod k\)。如果 \(i=n\) 那么只需要判断 \(nx\) 是否同余于 \(sum\)。

方案数就是:

\[k^{n-1}-\big((-1)^n[nx\equiv sum\pmod k]+\sum_{i=0}^{n-1} {n\choose i} (-1)^i k^{n-i-1}\big)
\]

对于所有 \(sum=2x\),考虑 \([nx\equiv 2x\pmod k]\) 的有解性,总方案数就是:

\[k^n-(k-1)^n+(-1)^n-(-1)^n\gcd(n-2,k)
\]

\(k\) 是偶数时更复杂一点。这时 \(2a_i\equiv sum \pmod k\) 在 \(sum\) 是偶数时有两个解,记为 \(x\) 和 \(x+\frac{k}{2}\)。

现在要求序列中这两个解必须至少出现一个,那么考虑计数两个解都没有出现的方案数。

依然考虑对于“没有出现”这一限制施加容斥,枚举 \(x\),\(x+\frac{k}{2}\) 的出现次数。

\[\sum_{i=0}^n \sum_{j=0}^n [i+j=n] (-1)^i (-1)^j [ix+j(x+\frac{k}{2})\equiv sum \pmod k]+\sum_{i=0}^n \sum_{j=0}^n {n\choose i,j,n-i-j} (-1)^i (-1)^j k^{n-i-j-1} [i+j<n]
\]

用三项式定理做一下右边的部分,就是:

\[\frac{(k-2)^n-(-2)^n}{k}
\]

左边的线性同余方程的解是一个等差数列,相当于是要组合数等差数列位置的和。这里场后被 zhy 教育了,可以直接循环卷积快速幂 \(O(k^2\log n)\) 做。

然而这个同余式太有性质了!整理一下:

\[[ix+(n-i)(x+\frac{k}{2})\equiv 2x \pmod k]
\]

也就是:

\[[(2-n)x \equiv (n-i)\frac{k}{2} \pmod k]
\]

右边只与 \(i\) 奇偶性有关!左边只与 \(n,x\) 有关!而众所周知组合数奇数偶数位置求和都是 \(2^{n-1}\)。

我们现在只需要求出满足 \([(2-n)x \equiv 0 \pmod k]\) 或 \([(2-n)x \equiv \frac{k}{2} \pmod k]\) 的 \(x\) 的个数。

注意 \(x\) 本来就满足 \(x<\frac{k}{2}\)可以统一写成 \([(2-n)x\equiv 0 \pmod{\frac{k}{2}}]\),\(x\) 的个数就是 \(\gcd(\frac{k}{2},n-2)\)。

总的式子就是:

\[\frac{k^n}{2}-\frac{(k-2)^n-(-2)^n}{2}-(-1)^{n}\gcd(n-2,\frac{k}{2})2^{n-1}
\]

这道题就做完了。

#include <cstdio>
using namespace std;
template<typename T>
T read(){
char c=getchar();T x=0;
while(c<48||c>57) c=getchar();
do x=(x<<1)+(x<<3)+(c^48),c=getchar();
while(c>=48&&c<=57);
return x;
}
typedef long long ll;
ll n;int k,p;
int qp(int a,ll b){
int res=1;
b%=(p-1);
while(b){
if(b&1) res=(ll)res*a%p;
a=(ll)a*a%p;b>>=1;
}
return res;
}
ll gcd(ll a,ll b){
if(!b) return a;
return gcd(b,a%b);
}
void inc(int &x,int v){if((x+=v)>=p) x-=p;}
void dec(int &x,int v){if((x-=v)<0) x+=p;}
int main(){
n=read<ll>();k=read<int>();p=read<int>();
if(n==1){puts("1");return 0;}
if(k&1){
int g=gcd(n-2,k);
int res=qp(k,n);
dec(res,qp(k-1,n));
if(n&1) inc(res,g-1);
else dec(res,g-1);
printf("%d\n",res);
}
else{
int g=gcd(n-2,k>>1);
int res=qp(k,n);
dec(res,qp(k-2,n));
inc(res,qp(p-2,n));
if(res&1) res=(res+p)>>1;
else res>>=1;
if(n&1) inc(res,(ll)qp(2,n-1)*g%p);
else dec(res,(ll)qp(2,n-1)*g%p);
printf("%d\n",res);
}
return 0;
}

CF1808E Minibuses on Venus 智商毁灭记的更多相关文章

  1. 比特宇宙-TCP/IP的诞生

    前情回顾: 我是一个explorer的线程 我是一个杀毒软件线程 我是一个IE浏览器线程 比特宇宙创世不久,宇宙中开始出现文明. 文明不断碰撞.融合.进化,逐渐分化为几大派系: 施行Unix体制的帝国 ...

  2. 2015 CTSC & APIO滚粗记

    o诶人太弱..... 记一发滚粗记以便治疗我的健忘症= = //文章会不定时修改,添加一些内容什么的...因此最好看一下刷新一下(因为有可能你正在看= =我正在写... 5.2 早上9点坐上长达11小 ...

  3. JSOI2015 分组赛记

    分组赛结束了,虽然跟我关系不大,但是去了还是学到了不少东西 day1 上午报到,在宾馆遇到大神wzy,orz 好像没有参赛证发了,于是给我发了一个[工作证],233我是工作人员了,高贵冷艳 下午是常中 ...

  4. HNOI2015滚粗记

    HNOI2015滚粗记 经过两天的苦战,艰难的HNOI终于结束了.感觉这次HNOI自己还是收获了许多. \(Day1\)打的很是艰难,题目一下就有种晕头转向的感觉.开场\(20min\)自己还在读题时 ...

  5. 谨记给UpdatePanel中动态添加的控件赋ID

    原文:谨记给UpdatePanel中动态添加的控件赋ID 昨天下定决 心对上次做的布局编辑器控件加以改进,其中最主要变化的就是要完全使用ASP.NET AJAX!但是很遗憾,虽然耳闻已久,但目前对AS ...

  6. THUWC逛街记

    1/28 这次打算去THUWC划个水,就定了1/29中午的飞机.同校有几个同学去PKUWC,求稳搭今天的飞机.中午时候听说今天飞长沙的飞机全都取消了,明天有没有也不好说( 事实证明29号有飞机:( ) ...

  7. CF Educational Codeforces Round 57划水记

    因为是unrated于是就叫划水记了,而且本场也就用了1h左右. A.B:划水去了,没做 C:大水题,根据初三课本中圆的知识,可以把角度化成弧长,而这是正多边形,所以又可以化成边数,于是假设读入为a, ...

  8. NOI2018退役记

    NOI2018退役记 终于我也退役了-- Day0 高中毕业前最后一次坐飞机了--在机场干什么呢?当然是打元气打元气打元气.下飞机干什么呢?当然是打元气打元气打元气. 有接机服务,大巴上有个导游,又向 ...

  9. 记一次HashMap面试

    记一次HashMap面试 从网上已经身边同事朋友的面试情况来看,面试HashMap几乎是必问的,网上也很多类似的文章,但是真面起来,发现还是有很多点可以深抠的.本篇就结合一次面试经历说一下之前没有注意 ...

  10. HEOI2018翻盘记

    HEOI2018翻盘记 听说依照惯例要写一篇游记?好吧,没有退役,我已经谢天谢地了QAQ.那就用两句歌词做开头吧: "遠い遠い夢の終わり.悪夢に似た現実はもう昔日久远,梦之终结,那犹如噩梦的 ...

随机推荐

  1. learning rate,exponential decay

    (96条消息) Python函数:学习率衰减 tf.train.exponential_decay()_萌萌哒huo的博客-CSDN博客_python 衰减函数 ln即学习率(learning rat ...

  2. ChatGPT的那些事 -1- 背景资料

    ChatGPT的那些事 -1- 背景资料 多处搬运,学无止境 目     录 1  关键词 1 1.1.  AIGC(百度百科) 1 1.2.  AlphaGo(百度百科) 1 1.3.  ChatG ...

  3. MS-08-067 windows smb服务 远程命令执行漏洞

    漏洞概要 MS-08-067是Windows平台中smb服务445端口的远程代码执行漏洞 利用成功可以远程控制主机 影响范围为:windows2000.xp.server 2003.server 20 ...

  4. RPA的概念及未来发展趋势

    ​ RPA是Robotic Process Automation(机器人自动化)的简称.我们可以把它理解为"虚拟机器人"替代人工的一种方式.RPA不仅可以模拟人类,而且可以利用和融 ...

  5. Linux的文件权限管理

    Linux文件权限管理介绍 一:Ubuntu 简介 1 .什么是Ubuntu Ubuntu是基于Debian开发的一个开源的Linux操作系统,Ubuntu这个名字名称来⾃⾮洲南部某种语言的一个词语, ...

  6. 文件的上传&预览&下载学习(四)

    0.参考博客 https://blog.csdn.net/Chengzi_comm/article/details/53037967 逻辑清晰 https://blog.csdn.net/alli09 ...

  7. Vue模板语法 && 数据绑定

    模板语法 Vue模板语法包括两大类 插值语法 功能:用于解析标签体内容. 写法:{{xxx}},xxx是js表达式,可以直接读取倒data中所有区域. 指令语法 功能:用于解析标签(包括:标签属性.标 ...

  8. Agora 教程丨一个典型案例,教你如何使用水晶球“数据洞察”

    7 月初,声网Agora 水晶球的"数据洞察"功能正式版上线."数据洞察"可显示两种数据,一种是用量,另一种是质量. "数据洞察"的&quo ...

  9. MS SQL Server 删除重复行数据

    您可以使用以下 SQL 语句删除 MS SQL Server 表中重复的行: WITH CTE AS ( SELECT ROW_NUMBER() OVER(PARTITION BY column1, ...

  10. Eclipse安装和配置环境教程(图文详解)

    前言 在上一篇文章中,壹哥给大家介绍了Notepad++这个更高级点的记事本,它进行Java开发相比windows自带的记事本要更方便一些.但是即便如此,用这种记事本进行Java开发效率依然很低.如果 ...