LOJ6268拆分数

news/2024/11/17 7:35:12/
/*相当于每种物品都有无限个的背包毕竟考场上写exp是个比较危险的行为对数据进行根号分治是个比较好的方法对于小于等于根号的部分暴力背包转移
对于大于根号的 最多只会拿根号个 dp一下就好了*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#include<cmath>
#define ll long long
#define M 100010
#define mmp make_pair
using namespace std;
const int mod = 998244353, g = 3;
void add(int &a, int b) {a += b;a -= a >= mod ? mod : 0;a += a < 0  ? mod : 0;}int poww(int a, int b) {int tmp = a, ans = 1;for(; b; b >>= 1, tmp = 1ll * tmp * tmp % mod) if(b & 1) ans = 1ll * ans * tmp % mod;return ans;
}int read() {int nm = 0, f = 1;char c = getchar();for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';return nm * f;
}
int a[M * 4], b[M * 4], biao, f[350][M], n, pw[M * 4], iw[M * 4];void fft(int *a, int n, int dft) {for(int i = 0, j = 0; i < n; i++) {if(i < j) swap(a[i], a[j]);for(int l = n >> 1; (j ^= l) < l; l >>= 1);}for(int step = 1; step < n; step <<= 1) {int wn = (dft == 1) ? pw[step] : iw[step];for(int i = 0; i < n; i += step << 1) {int wnk = 1;for(int j = i; j < i + step; j++) {int x = a[j], y = 1ll * wnk * a[j + step] % mod;a[j] = (x + y) % mod;a[j + step] = (x - y + mod) % mod;wnk = 1ll * wnk * wn % mod;}}}if(dft == -1) {int inv = poww(n, mod - 2);for(int i = 0; i < n; i++) a[i] = 1ll * a[i] * inv % mod;}
}int main() {n = read();a[0] = 1;biao = sqrt(n) + 1;for(int i = 1; i < biao; i++) {for(int j = i; j <= n; j++) {add(a[j], a[j - i]);}}f[1][biao] = 1;for(int i = 1; i <= biao; i++) {for(int j = 0; j <= n; j++) {if(f[i][j]) {if(j + i <= n) add(f[i][j + i], f[i][j]);if(j + biao <= n) add(f[i + 1][j + biao], f[i][j]);}add(b[j], f[i][j]);}}add(b[0], 1);for(int i = 1; i < 4 * M; i <<= 1) pw[i] = poww(g, (mod - 1) / 2 / i), iw[i] = poww(pw[i], mod - 2);n++;int up = (n << 1) - 1;while(up - (up & -up)) up += (up & -up);fft(a, up, 1), fft(b, up, 1);for(int i = 0; i < up; i++) a[i] = 1ll * a[i] * b[i] % mod;fft(a, up, -1);for(int i = 1; i < n; i++) cout << a[i] << '\n';return 0;
}

转载于:https://www.cnblogs.com/luoyibujue/p/10509527.html


http://www.ppmy.cn/news/177069.html

相关文章

UVALive - 6268 Cycling 贪心

UVALive - 6268 Cycling 题意&#xff1a;从一端走到另一端&#xff0c;有T个红绿灯&#xff0c;告诉你红绿灯的持续时间&#xff0c;求最短的到达终点的时间。x 思路&#xff1a; 转载于:https://www.cnblogs.com/macinchang/p/4753611.html

LOJ #6268. 分拆数

可以先将问题建模为 &#xff1a; 物品大小为1~inf 且每件物品数量无限 的背包选体积为1~n的方案数。 显然物品体积只有1~n有用&#xff0c;我们不妨把 体积1~sqrt(n) 的物品先暴力插入到背包中&#xff0c;设这一部分最后 体积i的方案数是 A[i] 。 考虑体积>sqrt(n)的物品怎…

[HDU6268]Master of Subgraph 树分治+bitset

bitset用法 bitset<B_Length> array[A_SIZE] 创建一个长度为B_Length,大小为A_SIZE的数组 bitset<B> a(n) 初始化一个值为n的bitset .reset() 将所有位初始化为0 .set() …

Hdu 6268 点分治 树上背包 bitset 优化

给你一颗大小为n(3000)的树,树上每个点有点权(100000),再给你一个数m(100000) i为1~m,问树中是否存在一个子图,使得权值为i. 每次solve到一个节点 用一个bitset维护所有经过它的链的取值(calc前要先初始化当前节点的bitset) 复杂度为nlognm/64 #include <bits/stdc.h> us…

HDU 6268 Master of Subgraph (2017CCPC杭州 E)分治+bitset优化

题目传送门 题意&#xff1a;给你一颗n(<3e3)个点的无向树&#xff0c;再给你一个数m(<1e5)&#xff0c;再给你n个点的权值a[i](<1e5) 求对于每个x属于[1,m]&#xff0c;是否存在一个连通子图的权值和正好为x。输出一个长度为m的01串&#xff0c;第i个位置上的数字表…

luogu P6268 [SHOI2002]舞会 [二分图最大独立集]

P6268 [SHOI2002]舞会 link 思路&#xff1a; 这题是一道二分图最大独立集的例题。 首先显然我们只用考虑两两跳过舞的男女&#xff0c; 剩下的就可以参加舞会。 考虑将跳过舞的两位人建一条无向边&#xff0c; 那一定是一张二分图。 那么求出有多少人不能参加舞会会比较简单。…

【LOJ6268】分拆数

【题目链接】 点击打开链接 【思路要点】 注意到 1 x x 2 x 3 . . . 1 1 − x 1xx^2x^3...\frac{1}{1-x} 1xx2x3...1−x1​ &#xff0c;答案 A n s Ans Ans 即为 ∏ i 1 ∞ 1 1 − x i \prod_{i1}^{\infty}\frac{1}{1-x^i} ∏i1∞​1−xi1​ 前 N N N 项的系数&…

loj6268. 分拆数

题意&#xff1a; 求 1 1 1~ n n n的分拆数。 题解&#xff1a; 考虑其生成函数为 F ( x ) ∑ i f ( i ) x i F(x)\sum_if(i)x^i F(x)∑i​f(i)xi 那么 F ( x ) ∏ i 1 1 1 − x i F(x)\prod_{i1}\frac1{1-x^i} F(x)∏i1​1−xi1​ 两边取对数得 ln ⁡ F ( x ) ∑ i 1…