[Contest20180415]看无可看
题意:有一个数列$f$,对$\forall i\geq2,f_i=2f_{i-1}+3f_{i-2}$,给定$f_0,f_1$,再给定一个集合$S=\{a_{1\cdots n}\}$和$k$,求$\begin{align*}\sum\limits_{\substack{S'\subset S\\|S'|=k}}f\left(\sum\limits_{x\in S'}x\right)\end{align*}$
先看这个数列,它的特征方程为$\lambda^2-2\lambda-3=0$,两个特征根为$\lambda_1=-1,\lambda_2=3$,所以它的通项公式为$f_n=c_1(-1)^n+c_23^n$,由$\begin{cases}c_1+c_2=f_0\\-c_1+3c_2=f_1\end{cases}$我们得到$\begin{cases}c_1=\dfrac{3f_0-f_1}4\\c_2=\dfrac{f_0+f_1}4\end{cases}$
所以我们可以对题目给出的式子进行一番操作:
$\begin{align*}\sum\limits_{\substack{S'\subset S\\|S'|=k}}f\left(\sum\limits_{x\in S'}x\right)&=\sum\limits_{\substack{S'\subset S\\|S'|=k}}c_1(-1)^{\sum\limits_{x\in S'}x}+c_23^{\sum\limits_{x\in S'}x}\\&=c_1\sum\limits_{\substack{S'\subset S\\|S'|=k}}\prod\limits_{x\in S'}(-1)^x+c_2\sum\limits_{\substack{S'\subset S\\|S'|=k}}\prod\limits_{x\in S'}3^x\end{align*}$
这种先抽取定量元素再求乘积的方式很像多项式乘法,事实上,对上式的第一个sigma,它等于$\begin{align*}[x^k]\prod\limits_{i=1}^n\left((-1)^{a_i}x+1\right)\end{align*}$,第二个sigma同理
这个多项式的乘积直接用分治+FFT计算即可,总时间复杂度$O(k\log_2k\log_2n)$
模数比较鬼畜,要用FFT,太久没写我都不知道FFT怎么卡精度了==($n$单位根的$0\cdots n-1$次幂全部预处理出来)
#include<stdio.h> #include<math.h> #include<string.h> typedef double du; typedef long long ll; const int mod=99991,inv4=24998; int min(int a,int b){return a<b?a:b;} int mul(int a,int b){return a*(ll)b%mod;} template<class C>void swap(C&a,C&b){ C c=a; a=b; b=c; } int pow(int a,int b){ int s=1; while(b){ if(b&1)s=mul(s,a); a=mul(a,a); b>>=1; } return s; } struct complex{ du x,y; complex(du a=0,du b=0){x=a;y=b;} }; complex operator+(complex a,complex b){return complex(a.x+b.x,a.y+b.y);} complex operator-(complex a,complex b){return complex(a.x-b.x,a.y-b.y);} complex operator*(complex a,complex b){return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);} int rev[262144],N,iN; complex w[18][262144]; void pre(int n){ int i,j,k; for(N=1,k=0;N<n;N<<=1)k++; for(i=0;i<N;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1)); k=0; for(i=1;i<=N;i<<=1){ for(j=0;j<i;j++)w[k][j]=complex(cos(j*M_PI/du(i)),sin(j*M_PI/du(i))); k++; } } void fft(complex*a,int on){ int i,j,k,c; complex t,wi; for(i=0;i<N;i++){ if(i<rev[i])swap(a[i],a[rev[i]]); } c=0; for(i=2;i<=N;i<<=1){ for(j=0;j<N;j+=i){ for(k=0;k<i>>1;k++){ wi=w[c][k]; if(on==-1)wi.y=-wi.y; t=wi*a[i/2+j+k]; a[i/2+j+k]=a[j+k]-t; a[j+k]=a[j+k]+t; } } c++; } if(on==-1){ for(i=0;i<N;i++)a[i].x/=(du)N; } } complex ta[262144],tb[262144]; void mul(int*a,int*b,int*c,int n,int m){ int i; pre(n+m+1); for(i=0;i<=n;i++)ta[i]=complex(a[i]); for(i=n+1;i<N;i++)ta[i]=complex(); for(i=0;i<=m;i++)tb[i]=complex(b[i]); for(i=m+1;i<N;i++)tb[i]=complex(); fft(ta,1); fft(tb,1); for(i=0;i<N;i++)ta[i]=ta[i]*tb[i]; fft(ta,-1); for(i=0;i<=n+m;i++)c[i]=llround(ta[i].x)%mod; } int b[100010],k; int*solve(int l,int r){ int mid,*f; f=new int[r-l+2]; memset(f,0,(r-l+2)<<2); if(l==r){ f[0]=1; f[1]=b[l]; }else{ mid=(l+r)>>1; mul(solve(l,mid),solve(mid+1,r),f,min(mid-l+1,k),min(r-mid,k)); } return f; } int a[100010]; int main(){ int n,i,f0,f1,c1,c2,ans; scanf("%d%d",&n,&k); for(i=1;i<=n;i++)scanf("%d",a+i); scanf("%d%d",&f0,&f1); c1=mul(3*f0-f1,inv4); c2=mul(f0+f1,inv4); ans=0; for(i=1;i<=n;i++)b[i]=pow(-1,a[i]); ans=(ans+mul(c1,solve(1,n)[k]))%mod; for(i=1;i<=n;i++)b[i]=pow(3,a[i]); ans=(ans+mul(c2,solve(1,n)[k]))%mod; printf("%d",(ans+mod)%mod); }
[Contest20180415]看无可看的更多相关文章
- Loj#6183. 看无可看
Loj#6183. 看无可看 题目描述 首先用特征根求出通项公式\(A_n=p\cdot 3^n+q\cdot(-1)^n\).通过给定的\(f_0,f_1\)可以解出\(p,q\). 然后我们要求的 ...
- 看无可看 分治FFT+特征值方程
题面: 看无可看(see.pas/cpp/c) 题目描述 “What’s left to see when our eyes won’t open?” “若彼此瞑目在即,是否终亦看无可看?” ---- ...
- 「6月雅礼集训 2017 Day1」看无可看
[题目大意] 给出n个数,a[1]...a[n],称作集合S,求
- 瞧一瞧,看一看呐,用MVC+EF快速弄出一个CRUD,一行代码都不用写,真的一行代码都不用写!!!!
瞧一瞧,看一看呐用MVC+EF快速弄出一个CRUD,一行代码都不用写,真的一行代码都不用写!!!! 现在要写的呢就是,用MVC和EF弄出一个CRUD四个页面和一个列表页面的一个快速DEMO,当然是在不 ...
- 2015年4月27日---C语言:输出特殊图案,请在c环境中运行,看一看,Very Beautiful!
---恢复内容开始--- 题目:输出特殊图案,请在c环境中运行,看一看,Very Beautiful! 1.程序分析:字符共有256个.不同字符,图形不一样. 2.程序源代码: [code=c] #i ...
- Scrum模拟微信看一看“疫情专区”的敏捷开发过程
无论作为产品用户还是管理咨询顾问,都非常非常喜欢微信.自认感情比较克制属于“高冷”挂,但从很多方面都太佩服太崇拜张小龙了(新书里微信也会是最喜欢的案例之一,真的不只是一个产品而已,很多方面都太牛了). ...
- Mysql数据库优化技术之配置篇、索引篇 ( 必看 必看 转)
转自:Mysql数据库优化技术之配置篇.索引篇 ( 必看 必看 ) (一)减少数据库访问对于可以静态化的页面,尽可能静态化对一个动态页面中可以静态的局部,采用静态化部分数据可以生成XML,或者文本文件 ...
- 今天做项目用到框架,关于angual,然后自己整理了一番,自己上网也看了看。
1. Angular 1.1. 库与框架的区别 jQuery:库 库一般都是封装了一些常用的方法 自己手动去调用这些方法,来完成我们的功能 $('#txt').val('我是小明'): $('div' ...
- PHP_Bibel阅读学习(一)——看书看经典,写文写代码
基础快速再看一下,然后每天有新的好玩的看. 这本书,反正好评不少,就是`PHP和MySQL Web开发`,机械工业出版社,澳洲人写的,红皮,有兴趣的可以看一下. 第一篇 使用PHP 一.入门 5分钟翻 ...
随机推荐
- Web自适应
随着移动设备的普及,移动web在前端工程师们的工作中占有越来越重要的位置.移动设备更新速度频繁,手机厂商繁多,导致的问题是每一台机器的屏幕宽度和分辨率不一样.这给我们在编写前端界面时增加了困难,适配问 ...
- JS中this的指向问题(读书笔记纯手打~)
一.this JavaScrip的this总是指向一个对象,而具体指向哪个对象是在运行时基于函数的执行环境动态绑定的,而非函数被声明时的环境. 二.this的指向 根据运用情景可分为四类: 1.作为对 ...
- WEB-INF 有关的目录路径问题总结
1.资源文件只能放在WebContent下面,如 CSS,JS,image等.放在WEB-INF下引用不了. 2.页面放在WEB-INF目录下面,这样可以限制访问,提高安全性.如JSP,html 3. ...
- [洛谷P2420] 让我们异或吧
题目链接:让我们异或吧 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是 ...
- request.getParameterValues与request.getParameter的区别
一. 简单的对比 request.getParameter用的比较多,相对熟悉 request.getParameterValues(String name)是获得如checkbox类(名字相同, ...
- HDU1003MAX SUM (动态规划求最大子序列的和)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- Linux 开机自动挂载windows分区
blkid 查看 uuid如下ps:或者使用uuidgen <设备>查看具体设备的uuidreddusty@reddusty-X550JK:~$ sudo blkid[sudo] pass ...
- UpdateData的用法(转)
原文转自 https://blog.csdn.net/ddjj_1980/article/details/51452289 UpdateData(TRUE)——刷新控件的值到对应的变量.(外部输入值交 ...
- selenium自动化添加日志
于logging日志的介绍,主要有两大功能,一个是控制台的输出,一个是保存到本地文件 先封装logging模块,保存到common文件夹命名为logger.py,以便于调用,直接上代码 filenam ...
- cpu_relax( )-----对自选循环等待(spin-wait loops)操作的优化【转】
cpu_relax()-----对自选循环等待(spin-wait loops)操作的优化 转自:http://www.doc100.net/bugs/t/173547/index.html 在loc ...