whk 的时候想到的 O(logk) 做法,很带劲,建议加强到 1018。
考虑因为不好计算 具体是哪个元素满足 2x≡S(modk),所以考虑统计全都不满足的序列然后减去。
k=1 或 n=1 时问题平凡,后文假设 k>1,n>1。
i. k≡1(mod2)
枚举 和 S 后有唯一的 x 使得 2x≡S(modk)。
现在要求不存在任何 x 且和为 S 的情况。
然后用一个容斥来计算(钦定 x 个不满足,全都满足)
f(i) 为钦定 i 个 x 的方案数,答案为 ∑ni=1(−1)if(i), f(i)=(ni)kn−i−1(x≠n), 因为无论前面的和是多少,最后一位都可以选择某个唯一的数使得答案是 S,所以原式可以化为
n−1∑i=1(−1)i(ni)kn−i−1+(−1)nf(n)=1k((k−1)n−(−1)n)+(−1)nf(n)
使用二项式定理处理求和,补上一个 (−1)n。
所有 S 的不符合的方案数之和就是
(k−1)n−(−1)n+(−1)nk−1∑s=0fs(n)
其中 fs(x) 表示和为 s 且钦定全放 x 的方案数等于 [nx≡S(modk)]=[(n−2)S(modk)]。
所以 ∑k−1s=0fs(n)=gcd(k,n−2)。
整理得答案等于 kn−(k−1)n+(−1)n−(−1)ngcd(k,n−2)。
ii.k≡0(mod2)
此时对于所有的奇数 S 一定不合法,考虑从 kn2 中减去不合法且 S 是偶数的方案数。
对于偶数 S,有且仅有 x1=S2,x2=S+k2 被禁止。
令 f(i) 为钦定 i 个 x1 或 x2 的方案数
n−1∑i=1(−1)i(ni)2ikn−i−1+(−1)nf(n)=1k((k−2)n−(−2)n)+(−1)nf(n)
所有 S 的不符合的方案数之和就是
12((k−2)n−(−2)n)+(−1)nk−1∑s=0fs(n)
其中 fs(n) 是 n 个 x1 或 x2 和为 S 的方案数。
假设有 c 个 x1,n−c 个 x2,那么要求
n∑c=0[cx1+(n−c)x2≡S(modk)](nc)
其中
cx1+(n−c)x2≡S(modk)k2c+S2n≡Sk2c≡(2−n)S2
仅当 (2−n)S≡0(mod)k2 时,才有 c=2n−1,否则 c=0,因为这相当于限制了组合数下指标的奇偶性,然后求和,所以答案总是等于 2n−1
那么有
fs(n)=2n−1[(2−n)S≡0(modk2)]
那么
∑s=2t,0<2t<kfs(n)=∑s=2t,0<2t<k2n−1[(2−n)S≡0(modk2)]=2n−1gcd(n−2,k2)
整理得答案为
12(kn−(k−2)n+(−2)n)+(−1)n2n−1gcd(n−2,k2)
时间复杂度 O(logn),瓶颈在求最大公因数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步