CF755G PolandBall and Many Other Balls 题解
从神 Karry 的题单过来的,然后自己瞎 yy 了一个方法,看题解区里没有,便来写一个题解
一个常数和复杂度都很大的题解
令 \(dp_{i,j}\) 为 在 \(i\) 个球中选 \(j\) 组的方案数,则显然有转移 \(dp_{i,j}=dp_{i-1,j}+dp_{i-1,j-1}+dp_{i-2,j-1}\)
然后考虑对其优化:
令 \(f_i\) 为 \(dp_i\) 的生成函数,则 \(f_i\) 只与 \(f_{i-1}\) 和 \(f_{i-2}\) 有关,且关系为 \(f_i=f_{i-2}\cdot x + f_{i-1}\cdot (x+1)\) .
然后考虑对上式进行矩阵加速递推,复杂度 \(O(k \log k \log n)\),再加一个巨大的常数,但此题 \(k\) 的范围很小,可以通过。
代码:
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define Fast_IO ios::sync_with_stdio(false);
#define fir first
#define sec second
#define mod 998244353
#define ll long long
inline int read()
{
char ch=getchar(); int nega=1; while(!isdigit(ch)) {if(ch=='-') nega=-1; ch=getchar();}
int ans=0; while(isdigit(ch)) {ans=ans*10+ch-48;ch=getchar();}
if(nega==-1) return -ans;
return ans;
}
typedef pair<int,int> pii;
int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
int sub(int x,int y){return x-y<0?x-y+mod:x-y;}
int mul(int x,int y){return 1LL*x*y%mod;}
int qpow(int x,int y)
{
int ans=1;
while(y)
{
if(y&1) ans=mul(ans,x);
x=mul(x,x);
y>>=1;
}
return ans;
}
int getInv(int x)
{
return qpow(x,mod-2);
}
// 略去多项式的板子,以下 vector 即是存储多项式的容器
using namespace Poly;
int n,k;
struct Mat
{
vector<int> a[3][3];
void clear()
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
a[i][j].resize(1);
a[i][j][0]=0;
}
}
}
};
Mat mul(Mat x,Mat y)
{
Mat ans; ans.clear();
for(int i=1;i<=2;i++)
{
for(int j=1;j<=2;j++)
{
for(int k=1;k<=2;k++)
{
ans.a[i][j]=ans.a[i][j]+x.a[i][k]*y.a[k][j];
}
}
}
for(int i=1;i<=2;i++)
{
for(int j=1;j<=2;j++)
{
if((int)ans.a[i][j].size()>k+1) ans.a[i][j].resize(k+1);
}
}
return ans;
}
Mat qpow(Mat x,int y)
{
Mat ans; ans.clear();
ans.a[1][1]=one,ans.a[2][2]=one;
while(y)
{
if(y&1)
{
ans=mul(ans,x);
}
x=mul(x,x);
y>>=1;
}
return ans;
}
signed main()
{
Init_Inv();
cin>>n>>k;
Mat a; a.clear();
a.a[1][2].resize(2); a.a[1][2][1]=1;
a.a[2][1]=one;
a.a[2][2].resize(2); a.a[2][2][1]=a.a[2][2][0]=1;
a=qpow(a,n-1);
Mat R; R.clear();
R.a[1][1]=one;
R.a[1][2].resize(2); R.a[1][2][0]=1,R.a[1][2][1]=1;
R=mul(R,a);
vector<int> ans=R.a[1][2];
ans.resize(k+1);
for(int i=1;i<=k;i++) printf("%d ",ans[i]); cout<<"\n";
return 0;
}
CF755G PolandBall and Many Other Balls 题解的更多相关文章
- 题解-CF755G PolandBall and Many Other Balls
题面 CF755G PolandBall and Many Other Balls 给定 \(n\) 和 \(m\).有一排 \(n\) 个球,求对于每个 \(1\le k\le m\),选出 \(k ...
- CF755G PolandBall and Many Other Balls/soj 57送饮料
题意:长度为n的序列,相邻两个或单独一个可以划分到一个组,每个元素最多处于一个组. 问恰好分割成k(1<=k<=m)段有多少种方案? 标程: #include<bits/stdc++ ...
- [POJ3783]Balls 题解
题目大意 鹰蛋问题.$ n\(个蛋,\)m\(层楼. 存在一层楼\)E\(,使得\)E\(以及\)E\(以下的楼层鹰蛋都不会摔碎,问最坏情况下最少多少次能够知道\)E$. 非常经典的模型,初看题目根本 ...
- CF850F Rainbow Balls 题解
考虑最后变成哪一种颜色. 设 \(s = \sum\limits_{i=1}^n a_i\) 设现在有 \(k\) 种当前颜色, 需要全部变成该种颜色, 期望步数为 \(f_k\). 考虑状态转移.设 ...
- FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅱ
因为垃圾电脑太卡了就重开了一个... 前传:多项式Ⅰ u1s1 我预感还会有Ⅲ 多项式基础操作: 例题: 26. CF438E The Child and Binary Tree 感觉这题作为第一题还 ...
- POJ 3687 Labeling Balls(拓扑排序)题解
Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them ...
- 【题解】Popping Balls AtCoder Code Festival 2017 qual B E 组合计数
蒟蒻__stdcall终于更新博客辣~ 一下午+一晚上=一道计数题QAQ 为什么计数题都这么玄学啊QAQ Prelude 题目链接:这里是传送门= ̄ω ̄= 下面我将分几个步骤讲一下这个题的做法,大家不 ...
- 洛谷 CF399B【Red and Blue Balls】题解
n年没有更博客:我总结出了规律,当学的东西很难得时候都去学习,没有时间写博客,只有 内容对于我这种蒟蒻友好,又让我非常闲的慌时才写博客,这种博客以后也没有价值(也有些是做完一道题有成就感写的) 最近内 ...
- 题解-AtCoder ARC-083F Collecting Balls
Problem ARC083F 题意概要:给定 \(2n\) 个二维平面上的球,坐标分别为 \((x_i,y_i)\),并给出 \(n\) 个 \(A\)类 机器人 和 \(n\) 个 \(B\)类 ...
随机推荐
- ECMAScript 6 和数组的新功能
Array. @@iterator 返回一个包含数组键值对的迭代器对象,可以通过同步调用得到数组元素的键值对 copyWithin 复制数组中一系列元素到同一数组指定的起始位置 entries 返回包 ...
- LinkList(链表)
code: #include <stdio.h> #include <time.h> #include <conio.h> #include <stdlib. ...
- excel表格 函数功能
1.去重复 选中一个区域——>数据——>删除重复项 2.条件求和 按照条件筛选:筛选出一样的类目,将对应的值求和. =sumif(A$1:A$10,B2,C$1:C$10) A$1:A$1 ...
- jsp遍历集合
1.先引入JSTL库 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> ...
- 一键绑定-提供一键动态绑定键盘输入的效果[C#制作](2020年寒假小目标07)
日期:2020.01.31 博客期:139 星期五 [需求部分] 嗯,其实我是找了一下网站,要实现按下一个键盘键可以按照顺序输出想要的多个键盘键,差不多就是这样的功能.为什么我会有想实现这样功能的想法 ...
- Plastic Sprayer Supplier - Sprayer: How Can The Product Be Sprayed?
In many end products, especially in cosmetics, the first thing that appeals to consumers is the form ...
- redis-key管理
redis-key管理 1. redis key 本章主要内容为redis key级别的操作命令. 参考文档:https://redis.io/commands 1.1. Redis ...
- C程序的执行和当前进程的结束
内核使程序执行的唯一方法,就是调用exec函数,这个函数又会启动一个C程序启动例程,这个启动例程是C程序的启动地址.负责调用main函数,并接受mainn函数的返回值. 使得进程结束的唯一方式是隐式的 ...
- 吴裕雄--天生自然PythonDjangoWeb企业开发:解决ModuleNotFoundError: No module named 'config'报错
使用创建完模块应用之后python manage.py startapp test_app,您应该进入settings.py并将其注册到
- 第1节 Scala基础语法:1、2、概述,什么是scala
Scala编程 1. 课程目标 1.1. 目标1:熟练使用scala编写Spark程序 1.2. 目标2:动手编写一个简易版的Spark通信框架 1.3. 目标3:为阅读Spark内核源码 ...