fxtoi zjzj

题面传送门

40 40 40分:爆搜,此处不作赘述

这道题硬推是很难推的,下面展示一下硬推的过程,以 f ( 4 , n ) f(4,n) f(4,n)为例

我们可以根据题目列出一个式子:

∑ i = 1 n ∑ j = 1 n ∑ k = 1 n ∑ s = 1 n 1 [ i + j + k + s = n ] \sum\limits_{i=1}^{n}{\sum\limits_{j=1}^{n}{\sum\limits_{k=1}^{n}{\sum\limits_{s=1}^{n}{1[i+j+k+s=n]}}}} i=1nj=1nk=1ns=1n1[i+j+k+s=n]

我们可以使用构造,约去 s s s

∑ i = 1 n ∑ j = 1 n ∑ k = 1 n 1 [ i + j + k < n ] \sum\limits_{i=1}^{n}{\sum\limits_{j=1}^{n}{\sum\limits_{k=1}^{n}{1[i+j+k<n]}}} i=1nj=1nk=1n1[i+j+k<n]

再来:

∑ i = 1 n − 3 ∑ j = 1 n − i − 2 ∑ k = 1 n − i − j − 1 1 [ i + j + k < n ] \sum\limits_{i=1}^{n-3}{\sum\limits_{j=1}^{n-i-2}{\sum\limits_{k=1}^{n-i-j-1}{1[i+j+k<n]}}} i=1n3j=1ni2k=1nij11[i+j+k<n]

这步似乎没有什么用,除了减小一点常数以外,但是这个式子等于

∑ i = 1 n − 3 ∑ j = 1 n − i − 2 ∑ k = 1 n − i − j − 1 1 \sum\limits_{i=1}^{n-3}{\sum\limits_{j=1}^{n-i-2}{\sum\limits_{k=1}^{n-i-j-1}{1}}} i=1n3j=1ni2k=1nij11

读者可以自行证明,接下来

∑ i = 1 n − 3 ∑ j = 1 n − i − 2 n − i − j − 1 \sum\limits_{i=1}^{n-3}{\sum\limits_{j=1}^{n-i-2}{n-i-j-1}} i=1n3j=1ni2nij1

化开

∑ i = 1 n − 3 ( ( n − i ) ( n − i − 2 ) − ∑ j = 1 n − i − 2 j + 1 ) \sum\limits_{i=1}^{n-3}{((n-i)(n-i-2)-\sum\limits_{j=1}^{n-i-2}{j+1})} i=1n3((ni)(ni2)j=1ni2j+1)

等差数列公式走起

∑ i = 1 n − 3 ( ( n − i ) ( n − i − 2 ) − ( n + 1 − i ) ( n − i − 2 ) 2 ) \sum\limits_{i=1}^{n-3}{((n-i)(n-i-2)-\frac{(n+1-i)(n-i-2)}{2})} i=1n3((ni)(ni2)2(n+1i)(ni2))

再化开

∑ i = 1 n − 3 1 2 ( n 2 − 2 i n + 2 i 2 + i − n − 2 ) \sum\limits_{i=1}^{n-3}{\frac{1}{2}(n^2-2in+2i^2+i-n-2)} i=1n321(n22in+2i2+in2)

然后套一个 ∑ i = 1 n i 2 = n ( n + 1 ) ( 2 n + 1 ) 6 \sum\limits_{i=1}^{n}{i^2}=\frac{n(n+1)(2n+1)}{6} i=1ni2=6n(n+1)(2n+1)公式就可以推出答案。

可见推 f ( k , n ) f(k,n) f(k,n)要用到 ∑ i = 1 n i k − 2 \sum\limits_{i=1}^{n}{i^{k-2}} i=1nik2的公式,而这个公式是没有通项式的所以我们要换个思路。

可以转换一下模型, f ( i , k ) f(i,k) f(i,k)表示在 k k k个球中间 k − 1 k-1 k1个空放 i i i个隔板把这些球分成不同数量的方案数,这明显是 A i k − 1 A_{i}^{k-1} Aik1,但会有重复,所以应该是 C i k − 1 C_{i}^{k-1} Cik1,答案为 ∑ i = 1 n − 1 C i n − 1 \sum\limits_{i=1}^{n-1}{C_{i}^{n-1}} i=1n1Cin1

在这里如果用杨辉三角爆推有 60 60 60分。但这个式子也没什么用,因为 C i n − 1 C_{i}^{n-1} Cin1无法处理,除非用杨辉三角或逆元,当模数是质数是可以用卢卡斯定理(但很可惜,这道题模数不是)但 ∑ i = 1 n − 1 C i n − 1 = 2 n − 1 \sum\limits_{i=1}^{n-1}{C_{i}^{n-1}}=2^{n-1} i=1n1Cin1=2n1!!想象一下,对于 n − 1 n-1 n1个空,每个空对应放与不放两种选择,而所有的情况就对应了所有的组合数。

那么有了这个结论,可以用快速幂优化到 80 80 80分(事实证明数据没造好,连普通的乘法都有 80 80 80),接下来怎么优化, n ≤ 5 × 1 0 1 0 7 n\leq5\times10^{10^7} n5×10107,似乎要用高精,但空间又不够(毒瘤出题人只给了 4 M 4M 4M空间( 275307894 a 275307894a 275307894a:还不够吗,足足是 s t d std std 5 5 5倍!!!)),所以考虑一下模数,我们会发现模数为 2 60 − 1 2^{60}-1 2601,那么 n = 61 n=61 n=61时和 n = 1 n=1 n=1时答案是一样的,所以可以 % 60 \%60 %60之后直接做普通乘法。但 % 60 \%60 %60又是个问题,高精不可能。

有这样两个定理: ( a % m o d ) ( b % m o d ) = a b % m o d (a\%mod)(b\%mod)=ab \% mod (a%mod)(b%mod)=ab%mod ( a % m o d + b % m o d ) % m o d = ( a + b ) % m o d (a\%mod+b\%mod)\%mod=(a+b) \% mod (a%mod+b%mod)%mod=(a+b)%mod

回想一下快读的过程,只有 × \times × + + +两种,那么直接可以用快读的方法过掉,最大用时 497 m s 497ms 497ms,( 275307894 a 275307894a 275307894a:你看,时限还是 s t d std std 2 2 2倍呢)

代码实现:

#include<cstdio>
using namespace std;
long long ans=1,tot,pus,n,x;
char s;
int main(){
	
	register int i;
	s=getchar();
	while(s<'0'||s>'9') s=getchar();
	while(s>='0'&&s<='9') x=((x<<3)+(x<<1)+(s^48))%60,s=getchar();
	x=(x+59)%60;
	for(i=1;i<=x;i++) ans*=2;
	printf("%lld\n",ans); 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值