Codeforces1096G Lucky Tickets(NTT优化dp)
设\(f[i][j]\)表示填了\(i\)个数,数位和为\(j\)的方案数
于是方程为:
\[f[i][j]=\sum_{k=0}^9 f[i-1][j-k]*[CanUse[k]==1]\]
其中\(CanUse[i]\)表示是否可用\(i\)这个数字
最终答案为:
\[\sum_{i=0}^{9*(n/2)}f[n/2][j]\]
直接转移肯定\(T\)飞,需要一些优化。于是我们观察到这个式子是卷积形式的式子,直接上\(NTT\)板子+快速幂即可
\(P.S.\)一些优化
可以把每个\(pow(g,(mod-1)/i)\)和\(pow(g,-(mod-1)/i)\)预处理出来,\(NTT\)过程中直接调用
快速幂前可以直接把系数表示化为点值表示,快速幂时直接乘,快速幂后再换回去系数表示
所以时间复杂度为\(0(9*(n/2)log_29*(n/2))\)
代码:
#include <bits/stdc++.h>
#define ll long long
#define mod 998244353ll
#define N 1048580
using namespace std;
ll G[N],F[N],tmp[N],tot[N],invG[N],inv,ans=0;
const ll g=3;
int rev[N],len,x;
void NTT(ll *a,int n,int f){
int i,j,k;
for(i=0;i<n;++i) if(i<rev[i]) swap(a[i],a[rev[i]]);
for(i=2;i<=n;i<<=1){
ll omega;
int m=i>>1;
(f==1)?omega=G[i]:omega=invG[i];
for(j=0;j<n;j+=i){
ll p=1;
for(k=j;k<j+m;++k,(p*=omega)%=mod){
ll u=a[k],v=p*a[k+m]%mod;
a[k]=(u+v)%mod,a[k+m]=(u-v+mod)%mod;
}
}
}
if(f==-1) for(i=0;i<n;++i) (a[i]*=inv)%=mod;
}
ll ksm(ll x,int y){
ll ans=1;
while(y){
if(y&1) (ans*=x)%=mod;
(x*=x)%=mod;
y>>=1;
}
return ans;
}
void init(int n){
int i;
for(len=1,x=0;len<=n;len<<=1,++x);
for(i=0;i<len;++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<(x-1));
G[len]=ksm(g,(mod-1)/len),invG[len]=ksm(g,mod-1-(mod-1)/len);
for(i=(len>>1);i>=2;i>>=1){
G[i]=G[i<<1]*G[i<<1]%mod;
invG[i]=invG[i<<1]*invG[i<<1]%mod;
}
}
void mul(ll *a,ll *b){
for(int i=0;i<len;++i) a[i]=a[i]*b[i]%mod;
}
int main(){
int n,d,i;
scanf("%d%d",&n,&d);n/=2;
for(i=1;i<=d;++i) scanf("%d",&x),F[x]=1;
init(9*n);
tot[0]=1;inv=ksm(1ll*len,mod-2);
NTT(F,len,1),NTT(tot,len,1);
x=n;
while(x){
if(x&1) mul(tot,F);
x>>=1;
if(x) mul(F,F);
}
NTT(tot,len,-1);
for(i=0;i<=9*n;++i) (ans+=tot[i]*tot[i]%mod)%=mod;
cout<<ans;
}
Codeforces1096G Lucky Tickets(NTT优化dp)的更多相关文章
- ZOJ 3874 Permutation Graph (分治NTT优化DP)
题面:vjudge传送门 ZOJ传送门 题目大意:给你一个排列,如果两个数构成了逆序对,就在他们之间连一条无向边,这样很多数会构成一个联通块.现在给出联通块内点的编号,求所有可能的排列数 推来推去容易 ...
- POJ-2346 Lucky tickets(线性DP)
Lucky tickets Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3298 Accepted: 2174 Descrip ...
- 4.13 省选模拟赛 树 树形dp 卷积 NTT优化dp.
考试的时候 看到概率 看到期望我就怂 推了一波矩阵树推自闭了 发现 边权点权的什么也不是. 想到了树形dp 维护所有边的断开情况 然后发现数联通块的和再k次方过于困难. 这个时候 应该仔细观察一下 和 ...
- HDU 5279 YJC plays Minecraft (分治NTT优化DP)
题目传送门 题目大意:有$n$个小岛,每个小岛上有$a_{i}$个城市,同一个小岛上的城市互相连接形成一个完全图,第$i$个小岛的第$a_{i}$个城市和第$i+1$个小岛的第$1$个城市连接,特别地 ...
- HDU 5322 Hope (分治NTT优化DP)
题面传送门 题目大意: 假设现在有一个排列,每个数和在它右面第一个比它大的数连一条无向边,会形成很多联通块. 定义一个联通块的权值为:联通块内元素数量的平方. 定义一个排列的权值为:每个联通块的权值之 ...
- Codeforces - 1096G - Lucky Tickets - NTT
https://codeforc.es/contest/1096/problem/G 把数组分成前后两半,那么前半部分的各个值的表示方案的平方的和就是答案. 这些数组好像可以dp出来. 一开始设dp[ ...
- codeforces1096G Lucky Tickets
题目链接:https://codeforces.com/problemset/problem/1096/G 大意:给出\(k\)个数码\(d_1,d_2,\cdots,d_k\),构造一个由这\(k\ ...
- Gym 100418J Lucky tickets(数位dp)
题意:给定一个n.求区间[1, n]之间的全部的a的个数.a满足: a能整除 把a表示自身二进制以后1的个数 思路:题意非常绕.... 数位dp,对于全部可能的1的个数我们都dfs一次 对于某一个可 ...
- Codeforces Gym 100418J Lucky tickets 数位DP
Lucky ticketsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view ...
随机推荐
- day 7-16 单表查询
一.准备工作 先把表建立好,方便一会查询. create table emp( id int not null unique auto_increment, name varchar(20) not ...
- day 7-5 守护线程
一. 守护线程 无论是进程还是线程,都遵循:守护进程(线程)会等待主进程(线程)运行完毕后被销毁. 需要强调的是:运行完毕并非终止运行. 1.对主进程来说,运行完毕指的是主进程代码运行完毕. 2.对主 ...
- Day 5-5 绑定方法与非绑定方法
绑定方法与非绑定方法: 在类内部定义的绑定方法,分两大类: classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入 ...
- C# Note29: Close()和Dispose()的区别
待更! 深入解析Close()和Dispose()的区别
- Android——AsyncTask
AsyncTask简单介绍 我们首先需要明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的.And ...
- LODOP 获取打印设计代码不带INIT初始化语句
前面的博文生成JS代码模版和文档式模版,生成的是带初始化语句的模版,如果想要打印多个,可以循环多个任务,什么是一个任务,可查看本博客相关博文:Lodop打印语句最基本结构介绍(什么是一个任务)一个任务 ...
- LODOP中page-break-before:always给div分页
Lodop中超过超文本打印项高度会自动分页:Lodop打印控件 超文本自动分页Lodop中还有NewPage和NewPageA,用于手动分页:Lodop强制分页LODOP.NewPage()和LODO ...
- CentOS7 搭建影梭服务器
安装Python包管理工具 yum install python-setuptools && easy_install pip 安装Shadowsocks pip install sh ...
- react 自我小计
1.react中的方法调用,在onClick事件中不需要加小括号. <button onClick={this.show}>方法的调用</button> show(){ con ...
- Windows & RabbitMQ:集群(clustering) & 高可用(HA)
描述:我们需要配置三台服务器:ServerA, ServerB, ServerC 注意事项: 所有的服务器的Erlang版本,RabbitMQ版本必须一样 服务器名大小写敏感 Step 1:安装Rab ...