定义$count(x)$为$x$二进制下1的个数,答案即$\sum_{0\le x<n,count(x)\equiv 1(mod\ 2)}f(x)$

考虑预处理出$S_{k,i,p}=\sum_{0\le x<2^{i},count(x)\equiv p(mod\ 2)}x^{k}$,可以对$x$最高位是否为1分类讨论,转移即
$$
S_{k,i,p}=S_{k,i-1,p}+\sum_{0\le x<2^{i-1},count(x)\not\equiv p(mod\ 2)}(x+2^{i-1})^{k}=S_{k,i-1,p}+\sum_{j=0}^{k}2^{(i-1)(k-j)}{k\choose j}S_{j,i-1,p\oplus 1}
$$
$k$的枚举范围即$o(k)$,$i$的枚举范围即$o(\log n)$,因此预处理复杂度为$o(k^{2}\log n)$

更进一步的,假设给定字符串为$n_{i}$(下标从0开始,且假设长度为$l$),枚举与其相同的前缀长度,答案即
$$
\sum_{0\le i<l,n_{i}=1}\sum_{0\le j<2^{l-i-1}-1,count(j)\not\equiv p(mod\ 2)}f(lst+j)
$$
(其中$p=\sum_{j=0}^{i-1}n_{j}$,$lst\equiv \sum_{j=0}^{i-1}n_{j}2^{l-j-1}$)

对后者展开并化简,即
$$
\sum_{0\le i<l,n_{i}=1}\sum_{t_{1}=0}^{k-1}a_{t_{1}}\sum_{t_{2}=0}^{t_{1}}{t_{1}\choose t_{2}}lst^{t1-t2}S_{t_{2},l-i-1,p\oplus 1}
$$
这里的计算复杂度也是$o(k^{2}\log n)$,两者的复杂度都无法通过

打表可以发现$S_{k,i,0}=S_{k,i,1}$在$k<i$时成立,具体证明如下——

考虑对$i$进行归纳,即在$i=i_{0}$时成立,来证明$i=i_{0}+1$也成立

首先$0\le k\le i_{0}$,再对$k$分类讨论:

1.若$k<i_{0}$,考虑转移式中的每一项都有$k<i=i_{0}$小,根据归纳即成立

2.若$k=i_{0}$,具体代入转移,唯一无法证明相同的两项恰为$S_{k,i_{0},p}$以及$S_{k,i,p\oplus 1}$,两者具有对称性,即也相等

综上,我们即得到此结论

对于预处理,可以强制$i\le j$,那么状态数为$o(k^{2})$,预处理复杂度即降为$o(k^{3})$

当$t_{2}<l-i-1$,显然此时$i$的范围是$o(k)$的,暴力计算复杂度也是$o(k^{3})$的

当$t_{2}\ge l-i-1$,考虑$S_{k,i,0}+S_{k,i,1}=\sum_{j=0}^{2^{i}-1}j^{k}$,即$S_{t_{2},l-i-1,p\oplus 1}=\frac{\sum_{j=0}^{2^{l-i-1}-1}j^{t_{2}}}{2}$

将之代入,并将$j$的枚举提到前面,即$\frac{\sum_{0\le i<l,n_{i}=1}\sum_{j=0}^{2^{l-i-1}-1}f(j)}{2}$,对后者通过$o(k^{3})$对$f(x)$的前缀和插值预处理处这个$k$次多项式,即可$o(k)$计算,那么总复杂度即$o(k^{3}+k\log n)$

但这样还是无法通过,考虑令$ans_{p}=\sum_{0\le x<n,count(x)\equiv p(mod\ 2)}f(x)$,所求的$ans_{1}$也可以看作是$\frac{(ans_{0}+ans_{1})-(ans_{0}-ans_{1})}{2}$,对前后两者分类讨论:

对于前者,实际意义即$\sum_{i=0}^{n-1}f(i)$,由于已经确定是$n-1$的前缀和,可以$o(k^{2})$插值计算

对于后者,用同样的方式计算,仅是将统计答案时变为$S_{t_{2},l-i-1,p\oplus 1}-S_{t_{2},l-i-1,p\oplus 0}$,这对于$t_{2}<l-i-1$只需要改变一下式子即可,对于$t_{2}\ge l-i-1$可以发现该式即为0,因此$o(k\log n)$的部分就被优化了

综上,这一做法的复杂度是$o(k^{3}+\log n)$,可以通过

(然而代码还是TLE了,应该只是常数问题QAQ)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 500005
4 #define K 505
5 #define mod 1000000007
6 int n,k,ans,a[K],mi[N],fac[K],inv[K],x[K],y[K],f[K][K][2];
7 char s[N];
8 int c(int n,int m){
9 return 1LL*fac[n]*inv[m]%mod*inv[n-m]%mod;
10 }
11 int pow(int n,int m){
12 int s=n,ans=1;
13 while (m){
14 if (m&1)ans=1LL*ans*s%mod;
15 s=1LL*s*s%mod;
16 m>>=1;
17 }
18 return ans;
19 }
20 int get_f(int x){
21 int s=1,ans=0;
22 for(int i=0;i<k;i++){
23 ans=(ans+1LL*s*a[i])%mod;
24 s=1LL*s*x%mod;
25 }
26 return ans;
27 }
28 void dfs(int l,int lst,int p){
29 if (l>=n)return;
30 if (s[l]=='0'){
31 dfs(l+1,lst,p);
32 return;
33 }
34 dfs(l+1,(lst+mi[n-l-1])%mod,(p^1));
35 if (n-l-1<k)
36 for(int i=0;i<k;i++){
37 int s=1;
38 for(int j=i;j>=0;j--){
39 ans=(ans+mod-1LL*a[i]*c(i,j)%mod*s%mod*(f[j][n-l-1][(p^1)]+mod-f[j][n-l-1][p])%mod)%mod;
40 s=1LL*s*lst%mod;
41 }
42 }
43 }
44 int main(){
45 mi[0]=1;
46 for(int i=1;i<N;i++)mi[i]=2*mi[i-1]%mod;
47 fac[0]=inv[0]=inv[1]=1;
48 for(int i=1;i<K;i++)fac[i]=1LL*fac[i-1]*i%mod;
49 for(int i=2;i<K;i++)inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod;
50 for(int i=1;i<K;i++)inv[i]=1LL*inv[i-1]*inv[i]%mod;
51 scanf("%s%d",s,&k);
52 n=strlen(s);
53 for(int i=0;i<k;i++)scanf("%d",&a[i]);
54 int nn=mod-1;
55 for(int i=0;i<n;i++)
56 if (s[i]=='1')nn=(nn+mi[n-i-1])%mod;
57 for(int i=0;i<=k;i++){
58 x[i]=i;
59 y[i]=get_f(i);
60 if (i)y[i]=(y[i]+y[i-1])%mod;
61 }
62 for(int i=0;i<=k;i++){
63 int s=y[i];
64 for(int j=0;j<=k;j++)
65 if (j!=i)s=1LL*s*(nn-x[j]+mod)%mod*pow((x[i]-x[j]+mod)%mod,mod-2)%mod;
66 ans=(ans+s)%mod;
67 }
68 f[0][0][0]=1;
69 for(int i=0;i<k;i++)
70 for(int j=1;j<k;j++){
71 for(int p=0;p<2;p++){
72 f[i][j][p]=f[i][j-1][p];
73 for(int t=0;t<=i;t++)f[i][j][p]=(f[i][j][p]+1LL*c(i,t)*pow(2,(j-1)*(i-t))%mod*f[t][j-1][p^1])%mod;
74 }
75 //i<j则S[i][j][0]=S[i][j][1]
76 //if (S[i][j][0]!=S[i][j][1])printf("%d %d\n",i,j);
77 }
78 dfs(0,0,1);
79 ans=1LL*ans*(mod+1)/2%mod;
80 printf("%d",ans);
81 return 0;
82 }

[luogu7468]愤怒的小N的更多相关文章

  1. 贪心 CF 332 C 好题 赞

    题目链接: http://codeforces.com/problemset/problem/332/C 题目意思: 有n个命令,要通过p个,某主席要在通过的p个中选择k个接受. 每个任务有两个值ai ...

  2. 一个初学者的辛酸路程-初识Python-1

    前言 很喜欢的一句话,与诸位共勉. 人的一切痛苦,本质上都是对自己无能的愤怒----王小波. 初识Python 一.它的爸爸是谁 首先,我们需要认识下面这位人物. 他是Python的创始人,吉多范罗苏 ...

  3. openlayers一:显示地图与鼠标地理坐标

    openlayers两个好用的开源JS互动地图库之一,另一个是leaflet. openlayers的特点是是大而全,自身包含绝大多数功能,文档好看. leaflet是小而美,自身小,但支持扩展,好用 ...

  4. Android:剖析源码,随心所欲控制Toast显示

    前言 Toast相信大家都不会陌生吧,如果对于Toast不甚了解,可以参考我的上一篇博客<Android:谈一谈安卓应用中的Toast情节>,里面有关于Toast基础比较详细的介绍.但是如 ...

  5. 【Android】11.3 屏幕旋转和场景变换过程中GridView的呈现

    分类:C#.Android.VS2015: 创建日期:2016-02-21 一.简介 实际上,对于布局文件中的View来说,大多数情况下,Android都会自动保存这些状态,并不需要我们都去处理它.这 ...

  6. Ubuntu11.04中如何将pycharm添加到系统的“应用程序”菜单里 (pycharm已成功安装)

    默认排序 Stu.zhouyc   21 人赞同了该回答 tools---->create desktop entry...不是很方便吗? 发布于 2016-04-09 21添加评论 分享 收藏 ...

  7. 洋媳妇Susan教育孩子的方法

    洋媳妇Susan教育孩子的方法 一个中国婆婆跟我说:「我的儿子去美国留学,毕业后定居美国. 还给我找了个洋媳妇Susan. 如今,小孙子Toby已经3岁了. 今年夏天,儿子為我申请了探亲签证. 在美国 ...

  8. vue-router 2.0 跳转之router.push()

    router.push(location) 除了使用 创建 a 标签来定义导航链接,我们还可以借助 router 的实例方法,通过编写代码来实现. router.push(location) 想要导航 ...

  9. iOS学习笔记-084.粒子效果——路径移动

    https://blog.csdn.net/qiwenmingshiwo/article/details/75806637 粒子效果路径移动一说明1 效果2 步骤分析二代码1 VCViewh2 VCV ...

随机推荐

  1. VS运行时 /MD、/MDd 和 /MT、/MTd之间的区别

    程序运行时出现问题,选择的是Release,win64位的模式,并且已经看到了宏定义NDEBUG,但是程序依然进入上面的部分 解决方案是将属性->C/C++->代码生成器->运行库里 ...

  2. VS Code环境配置

    1.语言配置 2.Node.js安装配置 系统变量中NODE_PATH,变量值为nodejs的安装路径. 用户变量Path包含%NODE_PATH% 如果说通过CMD打开的命令行可以执行node -v ...

  3. Vue3学习(五)之集成HTTP库axios

    一.安装axios npm install axios@0.21.0 --save 二.axios的使用 1.在主页中引用axios 在Vue3新增了setup初始化方法,所以我们在这里开始使用并测试 ...

  4. 听说,99% 的 Go 程序员都被 defer 坑过

    原文链接: 听说,99% 的 Go 程序员都被 defer 坑过 先声明:我被坑过. 之前写 Go 专栏时,写过一篇文章:Go 专栏|错误处理:defer,panic 和 recover.有小伙伴留言 ...

  5. Linux 命令后&的作用

    cp $filename /dev/ & & 代表非阻塞方式拷贝文件,如果不加& 则必须等到执行完该指令后才能执行后来的指令.

  6. django 1.11.16之环境搭建

    django版本:django1.11.16  windows环境 python 3.6.3    !!!可先安装虚拟环境在进行环境搭建  1.安装django:pip install django= ...

  7. 初学python写个自娱自乐的小游戏

    一.摘要 当编写完后的代码执行第一次后达到了目标的预期效果,内心有些许满足,但是当突发情况产生后,程序便不能正常运行,于是准备从简单的版本开始出发,综合考虑使用者的需求,和使用过程中会遇到的问题,一步 ...

  8. bash反弹shell

    part1:不求甚解的本地复现 攻击端Debian 10.x:  192.168.208.134 受害端Ubuntu : 192.168.208.135 攻击端打开(监听)某端口:  键入命令:[nc ...

  9. 第五课第四周笔记4:Transformer Network变压器网络

    Transformer Network变压器网络 你已经了解了 self attention,你已经了解了 multi headed attention.在这个视频中,让我们把它们放在一起来构建一个变 ...

  10. Java:LinkedList类小记

    Java:LinkedList类小记 对 Java 中的 LinkedList类,做一个微不足道的小小小小记 概述 java.util.LinkedList 集合数据存储的结构是循环双向链表结构.方便 ...