[luogu7468]愤怒的小N
定义$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的更多相关文章
- 贪心 CF 332 C 好题 赞
题目链接: http://codeforces.com/problemset/problem/332/C 题目意思: 有n个命令,要通过p个,某主席要在通过的p个中选择k个接受. 每个任务有两个值ai ...
- 一个初学者的辛酸路程-初识Python-1
前言 很喜欢的一句话,与诸位共勉. 人的一切痛苦,本质上都是对自己无能的愤怒----王小波. 初识Python 一.它的爸爸是谁 首先,我们需要认识下面这位人物. 他是Python的创始人,吉多范罗苏 ...
- openlayers一:显示地图与鼠标地理坐标
openlayers两个好用的开源JS互动地图库之一,另一个是leaflet. openlayers的特点是是大而全,自身包含绝大多数功能,文档好看. leaflet是小而美,自身小,但支持扩展,好用 ...
- Android:剖析源码,随心所欲控制Toast显示
前言 Toast相信大家都不会陌生吧,如果对于Toast不甚了解,可以参考我的上一篇博客<Android:谈一谈安卓应用中的Toast情节>,里面有关于Toast基础比较详细的介绍.但是如 ...
- 【Android】11.3 屏幕旋转和场景变换过程中GridView的呈现
分类:C#.Android.VS2015: 创建日期:2016-02-21 一.简介 实际上,对于布局文件中的View来说,大多数情况下,Android都会自动保存这些状态,并不需要我们都去处理它.这 ...
- Ubuntu11.04中如何将pycharm添加到系统的“应用程序”菜单里 (pycharm已成功安装)
默认排序 Stu.zhouyc 21 人赞同了该回答 tools---->create desktop entry...不是很方便吗? 发布于 2016-04-09 21添加评论 分享 收藏 ...
- 洋媳妇Susan教育孩子的方法
洋媳妇Susan教育孩子的方法 一个中国婆婆跟我说:「我的儿子去美国留学,毕业后定居美国. 还给我找了个洋媳妇Susan. 如今,小孙子Toby已经3岁了. 今年夏天,儿子為我申请了探亲签证. 在美国 ...
- vue-router 2.0 跳转之router.push()
router.push(location) 除了使用 创建 a 标签来定义导航链接,我们还可以借助 router 的实例方法,通过编写代码来实现. router.push(location) 想要导航 ...
- iOS学习笔记-084.粒子效果——路径移动
https://blog.csdn.net/qiwenmingshiwo/article/details/75806637 粒子效果路径移动一说明1 效果2 步骤分析二代码1 VCViewh2 VCV ...
随机推荐
- 洛谷2120 [ZJOI2007]仓库建设(斜率优化dp)
感觉和锯木厂那个题很类似的. 其实这个题还那个题唯一的区别就是\(dp\)转移式子中的\(f\)变成了\(g\) qwq不想多说了 直接看我的前一篇题解吧qwq #include<iostrea ...
- centos无法建立ssl连接
在centos下使用wget安装mysql5.7时,提示无法建立ssl连接 查阅资料,在命令wget后加上 --no-check-certificate也还是无法建立SSL连接. 后来,觉得可能是由于 ...
- pycharm输入代码后,没有补全提示
安装pycharm后,输入代码后,没有补全提示 首先检查是否关闭了代码提示,如下图,将红框中"Power Save Mode"前的勾去掉 第二步,如果在输入某些代码时还是没有补全提 ...
- [kuangbin带你飞]专题一 简单搜索 棋盘问题
题来:链接https://vjudge.net/problem/OpenJ_Bailian-132 J - 棋盘问题 1.题目: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别. ...
- Oracle12C安装教程
准备工作 网盘链接: https://pan.baidu.com/s/1gffHbOjImk1SfezdWO2Bpw 提取码: imft Oracle12C的安装 1.分别解压"winx64 ...
- opencv学习(一)——图像入门
图像入门 一.读取图像 在opencv中使用cv.imread(filename, flags)函数读取图像.filename参数表示读取图像的路径.读取图像的路径应完整给出,且不能含有中文,否则在调 ...
- 贪心-Saruman‘s Army POJ - 3069
万恶之源 目录 题意 思路 贪心的原则是什么呢? 错解 正解 代码实现 书上的代码 我的代码 比较一下 问题 题意 给定若干个点的坐标,与范围R.每个点可以选择是否标记,标记后这个点的左右范围R内的所 ...
- 进程间通信消息队列msgsnd执行:Invlid argument——万恶的经验主义
最近在搞进程间通信,首先在我的ubuntu 14.04上写了接口和测试demo,编译和执行都OK,,代码如下: 接口文件ipcmsg.h /* ipcmsg.h */ #ifndef H_MSGIPC ...
- 双栈排序 牛客网 程序员面试金典 C++ Python
双栈排序 牛客网 程序员面试金典 C++ Python 题目描述 请编写一个程序,按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中. ...
- CF #749
A 题意 有个长度为n的序列, 每个数互不相同, 求总和最大的最长子序列, 并输出每个i: 题解 emmmmmm, 刚开始看到这个数据和题解被迷惑了, 以为有什么顺序, 并且一直在想一些复杂度较高的算 ...