首页 > 其他分享 >CF755G PolandBall and Many Other Balls 题解

CF755G PolandBall and Many Other Balls 题解

时间:2022-11-19 17:12:44浏览次数:56  
标签:Balls int 题解 CF755G vector MAXN ans include MOD

老师潦草的笔记(

题目大意


给你 $n$ 个球,让你选 $m(1 \le m \le k)$ 组球。每组只有 $1$ 个球或 $2$ 个相邻球。

令选出 $m$ 组球的方案数为 $f_m$,现在让你输出 $f_i(1 \le k \le i) % 998244353$

数据范围

$$n \le 10^9, k < 2^{15}$$

分析


看到这一题的第一眼,我想到了用 dp 求解。

假设在 $i$ 组球分成 $j$ 组的方案为 $f_{[i,j]}$,我们能得到转移方程 $f_{[i,j]}=f_{[i-1,j]}+f_{[i-1,j-1]}+f_{[i-2,j-1]}$

AC 代码

/*****************************************
备注:
******************************************/
#include<queue>
#include<math.h>
#include<stack>
#include<stdio.h>
#include<iostream>
#include<vector>
#include<iomanip>
#include<map>
#include<string.h>
#include<algorithm>
using namespace std;
#define int unsigned long long
const int MAXN = 1 << 16;
const int MR = 10 + 5;
const int INF = 0x3f3f3f3f;
const int MOD = 998244353;
void add(int &x,int &y)
{
	x += y;
	if(x >= MOD)x -= MOD;
}
int ksm(int a,int b)
{
	int ans = 1;
	while(b)
	{
		if(b & 1)ans = ans * a % MOD;
		a = a * a % MOD;
		b >>= 1;
	}
	return ans;
}
vector<int> ans;//存储每一个f{1~k}的答案
int n, k, bin[MAXN];
map<int, vector<int> > mp;//记忆化
void NTT(vector<int> &A, int num)
{
	int x[MAXN], y[MAXN];
	for(int i = 0;i < MAXN; i++)
	{
		x[i] = A[bin[i]];
	}
	int xxx, xxxx;
	if(num)xxx = 3,xxxx = 1;
	else xxx = (MOD + 1) / 3, xxxx = ksm(MAXN, MOD - 2);
	for(int k = 1;k < MAXN; k <<= 1)
	{
		int tmp = ksm(xxx, (MOD - 1) / k / 2);
		for(int i = y[0] = 1;i < k; i++)
		{
			y[i] = y[i - 1] * tmp % MOD;
		}
		for(int i = 0;i < MAXN; i += (k << 1))
		{
			for(int j = 0;j < k; j++)
			{
				int ttmp = y[j] * x[i|j|k] % MOD;
				x[i|j|k] = x[i|j] + MOD - ttmp;
				x[i|j] += ttmp;
			}
		}
	}
	for(int i = 0;i < MAXN; i++)
	{
		A[i] = x[i] % MOD * xxxx % MOD;
	}
}
vector<int> operator *(vector<int> a,vector<int> b)
{
	for(int i = MAXN  >> 1;i < MAXN; i++)a[i] = b[i] = 0;
	NTT(a, 1);
	NTT(b, 1);
	for(int i = 0;i < MAXN; i++)a[i] = a[i] * b[i] % MOD;
	NTT(a, 0);
	return a;
}
vector<int> solve(int n)
{
	vector<int> ans(MAXN, 0);//开MAXN,清0
	if(n == 0)
	{
		ans[0] = 1;
		return ans;
	}
	if(n == 1)
	{
		ans[0] = ans[1] = 1;
		return ans;
	}
	if(n == 2)
	{
		ans[0] = ans[2] = 1;
		ans[1] = 3;
		return ans;
	}
	if(mp.find(n) != mp.end())return mp[n];
	int tmp = (n - 2) >> 1;
	vector<int> l = solve(tmp), r = solve(tmp + 1);
	vector<int> xxx = r;
	for(int i = 1;i < MAXN; i++)
	{
		add(xxx[i], r[i - 1]);
		add(xxx[i], l[i - 1]);
	}
	vector<int>ll = l * (n & 1 ? r : l);
	vector<int>rr = r * (n & 1 ? xxx : r);
	for(int i = 0;i < MAXN; i++)
	{
		ans[i] = rr[i];
		if(i > 0)add(ans[i], ll[i - 1]);
	}
	mp[n] = ans;
	return ans;
}
signed main()
{
	for(int i = 0;i < MAXN; i++)
	{
		bin[i] = (bin[i >> 1] >> 1) | ((i & 1) << 15);
	}
	cin >> n >> k;
	ans = solve(n);
	for(int i = 1;i <= k; i++)
	{
		cout << ans[i] << ' ';
	}
	return 0;
}

标签:Balls,int,题解,CF755G,vector,MAXN,ans,include,MOD
From: https://www.cnblogs.com/CJKhomes/p/16906494.html

相关文章

  • arc136D Without Carry 题解
    这阵子没一道题能自己想出来,开道黄题以下找找信心qwq又一道比C简单的D。题意:给出\(n\)个\(6\)位及以下数字,问有几对数字的和在十进制下无进位。\(n\leq10^6\)......
  • 题解 Codeforces Round #834 (Div. 3) ABCDEF
    A.Yes-Yes?problem判断给定的字符串是否为无穷个YesYesYes拼接组成的字符串的连续子串。\(|S|\leq50\)。solution暴力。具体地,判断\(S,Ye+S,Y+S\)是否有一个是......
  • python(牛客)试题解析1 - 简单
    导航:一、NC103反转字符串二、NC141判断是否为回文字符串三、NC151最大公约数四、NC65斐波那契数列五、字符按排序后查看第k个最小的字母六、数组内取出下标相同......
  • 移动端点击穿透问题解决
    js解决方案1、只用touch把页面内所有click全部换成touch事件(touchstart、touchend、tap),需要特别注意a标签,a标签的href也是click,需要去掉换成js控制的跳转,或者直接改成......
  • Codeforces Round #829 A+B+C+D 题解
    A.TheUltimateSquare题意询问\(T\)次,给定\(n\)块木板,第\(i\)块为\(1\times\lceil\fraci2\rceil\)大小,求能拼出的最大正方形边长数据范围:\(1\len\le10^9,1......
  • 【题解】做题记录(2022.11)
    11.1CF449DJzzhuandNumbers题目分析:考虑直接算的话就相当于限制每一位必须有一个\(0\),显然不如反着来,也就是某一位必须全为\(1\),也就是我们计算与之后不为\(0\)......
  • DSOJ 题解 #202103. 【21网络赛C】来帮我们排排名
    【21网络赛C】来帮我们排排名-题目-DSOJ#include<stdio.h>#include<stdlib.h>#include<string.h>structplayer_data{charid[11];intproblem_tim......
  • luogu P7201 [COCI2019-2020#1] Džumbus题解
    须知本题解骨架是本人由官方题解翻译得来的,并补充了一些不详细的地方,修改了一些错误,自己写了每一个子任务的代码(因为官方题解代码和文本不太匹配)。基本信息任务名:Džumb......
  • P5999 [CEOI2016] kangaroo 蓝 题解
    前言有些题目照常DP不是很好做,感觉像是区间DP,但是怎么设状态都不好转移,那么可以考虑一种维护块儿的DP,就是这道题要用到的知识点。背景分析如果每次跳跃的点的编号形......
  • 恒创科技:有关服务器虚拟化的常见问题解答
    虚拟化”一词经常使用,尤其是与服务器相关的时候。以下是一些有关服务器虚拟化常见问题的解答。什么是服务器虚拟化?虚拟化是一个经常应用于范围广泛的......