题意:有一个数列$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$次幂全部预处理出来)

  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<string.h>
  4. typedef double du;
  5. typedef long long ll;
  6. const int mod=99991,inv4=24998;
  7. int min(int a,int b){return a<b?a:b;}
  8. int mul(int a,int b){return a*(ll)b%mod;}
  9. template<class C>void swap(C&a,C&b){
  10. C c=a;
  11. a=b;
  12. b=c;
  13. }
  14. int pow(int a,int b){
  15. int s=1;
  16. while(b){
  17. if(b&1)s=mul(s,a);
  18. a=mul(a,a);
  19. b>>=1;
  20. }
  21. return s;
  22. }
  23. struct complex{
  24. du x,y;
  25. complex(du a=0,du b=0){x=a;y=b;}
  26. };
  27. complex operator+(complex a,complex b){return complex(a.x+b.x,a.y+b.y);}
  28. complex operator-(complex a,complex b){return complex(a.x-b.x,a.y-b.y);}
  29. complex operator*(complex a,complex b){return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
  30. int rev[262144],N,iN;
  31. complex w[18][262144];
  32. void pre(int n){
  33. int i,j,k;
  34. for(N=1,k=0;N<n;N<<=1)k++;
  35. for(i=0;i<N;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1));
  36. k=0;
  37. for(i=1;i<=N;i<<=1){
  38. for(j=0;j<i;j++)w[k][j]=complex(cos(j*M_PI/du(i)),sin(j*M_PI/du(i)));
  39. k++;
  40. }
  41. }
  42. void fft(complex*a,int on){
  43. int i,j,k,c;
  44. complex t,wi;
  45. for(i=0;i<N;i++){
  46. if(i<rev[i])swap(a[i],a[rev[i]]);
  47. }
  48. c=0;
  49. for(i=2;i<=N;i<<=1){
  50. for(j=0;j<N;j+=i){
  51. for(k=0;k<i>>1;k++){
  52. wi=w[c][k];
  53. if(on==-1)wi.y=-wi.y;
  54. t=wi*a[i/2+j+k];
  55. a[i/2+j+k]=a[j+k]-t;
  56. a[j+k]=a[j+k]+t;
  57. }
  58. }
  59. c++;
  60. }
  61. if(on==-1){
  62. for(i=0;i<N;i++)a[i].x/=(du)N;
  63. }
  64. }
  65. complex ta[262144],tb[262144];
  66. void mul(int*a,int*b,int*c,int n,int m){
  67. int i;
  68. pre(n+m+1);
  69. for(i=0;i<=n;i++)ta[i]=complex(a[i]);
  70. for(i=n+1;i<N;i++)ta[i]=complex();
  71. for(i=0;i<=m;i++)tb[i]=complex(b[i]);
  72. for(i=m+1;i<N;i++)tb[i]=complex();
  73. fft(ta,1);
  74. fft(tb,1);
  75. for(i=0;i<N;i++)ta[i]=ta[i]*tb[i];
  76. fft(ta,-1);
  77. for(i=0;i<=n+m;i++)c[i]=llround(ta[i].x)%mod;
  78. }
  79. int b[100010],k;
  80. int*solve(int l,int r){
  81. int mid,*f;
  82. f=new int[r-l+2];
  83. memset(f,0,(r-l+2)<<2);
  84. if(l==r){
  85. f[0]=1;
  86. f[1]=b[l];
  87. }else{
  88. mid=(l+r)>>1;
  89. mul(solve(l,mid),solve(mid+1,r),f,min(mid-l+1,k),min(r-mid,k));
  90. }
  91. return f;
  92. }
  93. int a[100010];
  94. int main(){
  95. int n,i,f0,f1,c1,c2,ans;
  96. scanf("%d%d",&n,&k);
  97. for(i=1;i<=n;i++)scanf("%d",a+i);
  98. scanf("%d%d",&f0,&f1);
  99. c1=mul(3*f0-f1,inv4);
  100. c2=mul(f0+f1,inv4);
  101. ans=0;
  102. for(i=1;i<=n;i++)b[i]=pow(-1,a[i]);
  103. ans=(ans+mul(c1,solve(1,n)[k]))%mod;
  104. for(i=1;i<=n;i++)b[i]=pow(3,a[i]);
  105. ans=(ans+mul(c2,solve(1,n)[k]))%mod;
  106. printf("%d",(ans+mod)%mod);
  107. }

[Contest20180415]看无可看的更多相关文章

  1. Loj#6183. 看无可看

    Loj#6183. 看无可看 题目描述 首先用特征根求出通项公式\(A_n=p\cdot 3^n+q\cdot(-1)^n\).通过给定的\(f_0,f_1\)可以解出\(p,q\). 然后我们要求的 ...

  2. 看无可看 分治FFT+特征值方程

    题面: 看无可看(see.pas/cpp/c) 题目描述 “What’s left to see when our eyes won’t open?” “若彼此瞑目在即,是否终亦看无可看?” ---- ...

  3. 「6月雅礼集训 2017 Day1」看无可看

    [题目大意] 给出n个数,a[1]...a[n],称作集合S,求

  4. 瞧一瞧,看一看呐,用MVC+EF快速弄出一个CRUD,一行代码都不用写,真的一行代码都不用写!!!!

    瞧一瞧,看一看呐用MVC+EF快速弄出一个CRUD,一行代码都不用写,真的一行代码都不用写!!!! 现在要写的呢就是,用MVC和EF弄出一个CRUD四个页面和一个列表页面的一个快速DEMO,当然是在不 ...

  5. 2015年4月27日---C语言:输出特殊图案,请在c环境中运行,看一看,Very Beautiful!

    ---恢复内容开始--- 题目:输出特殊图案,请在c环境中运行,看一看,Very Beautiful! 1.程序分析:字符共有256个.不同字符,图形不一样. 2.程序源代码: [code=c] #i ...

  6. Scrum模拟微信看一看“疫情专区”的敏捷开发过程

    无论作为产品用户还是管理咨询顾问,都非常非常喜欢微信.自认感情比较克制属于“高冷”挂,但从很多方面都太佩服太崇拜张小龙了(新书里微信也会是最喜欢的案例之一,真的不只是一个产品而已,很多方面都太牛了). ...

  7. Mysql数据库优化技术之配置篇、索引篇 ( 必看 必看 转)

    转自:Mysql数据库优化技术之配置篇.索引篇 ( 必看 必看 ) (一)减少数据库访问对于可以静态化的页面,尽可能静态化对一个动态页面中可以静态的局部,采用静态化部分数据可以生成XML,或者文本文件 ...

  8. 今天做项目用到框架,关于angual,然后自己整理了一番,自己上网也看了看。

    1. Angular 1.1. 库与框架的区别 jQuery:库 库一般都是封装了一些常用的方法 自己手动去调用这些方法,来完成我们的功能 $('#txt').val('我是小明'): $('div' ...

  9. PHP_Bibel阅读学习(一)——看书看经典,写文写代码

    基础快速再看一下,然后每天有新的好玩的看. 这本书,反正好评不少,就是`PHP和MySQL Web开发`,机械工业出版社,澳洲人写的,红皮,有兴趣的可以看一下. 第一篇 使用PHP 一.入门 5分钟翻 ...

随机推荐

  1. POJ2396:Budget(带下界的网络流)

    Budget Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 8946   Accepted: 3327   Special ...

  2. PHP 抽象类,接口,抽象方法,静态方法

    1.Abstract class(抽象类) 抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 抽象类 ...

  3. iBatis之Iterator的使用

    一:前言 现在这个项目使用的是iBatis,我刚刚开始的时候说是用MyBatis,因为我以前用过,觉得还是比较好用的啊,而且不像iBatis样,查什么一个字段不能多也不能少,觉得好无语啊. 二:内容 ...

  4. struts2学习笔记(三)

    一. Struts2 的验证 1). 验证分为两种: > 声明式验证* >> 对哪个 Action 或 Model 的那个字段进行验证 >> 使用什么验证规则 >& ...

  5. C++中的各种“神奇”东西

    将光标放到任意的位置 void gotoxy(int x,int y)//位置函数 { COORD pos; pos.X=x; pos.Y=y; SetConsoleCursorPosition(Ge ...

  6. CentOs7安装JDK/Tomcat/Git/Gradle

    安装Jdk: wget http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/j ...

  7. bzoj 2705 数学 欧拉函数

    首先因为N很大,我们几乎不能筛任何东西 那么考虑设s(p)为 gcd(i,n)=p 的个数,显然p|n的时候才有意义 因为i与n的gcd肯定是n的因数,所以那么可得ans=Σ(p*s(p)) 那么对于 ...

  8. Atos cannot get symbols from dSYM of archived application

    http://stackoverflow.com/questions/7675863/atos-cannot-get-symbols-from-dsym-of-archived-application ...

  9. Linux 2.6内核Makefile浅析【转】

    转自:http://blog.csdn.net/tommy_wxie/article/details/7280463 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 概述 ...

  10. 关于Solaris的一些小技巧

    关于Solaris的一些小技巧 http://blog.chinaunix.net/uid-9787800-id-2394301.html SunOS 操作命令及linux区别 http://blog ...