首页 > 其他分享 >[CF958F3] Lightsabers (hard)

[CF958F3] Lightsabers (hard)

时间:2023-12-09 09:55:22浏览次数:29  
标签:std return Lightsabers int vi hard ret vector CF958F3

题目链接

对于一种元素 \(v\),假设它在给出可重集合中出现了 \(t\) 次,那么容易把它表示成基础的生成函数形式:\(1+x+x^2+x^3+\dots+x^t\)。

显然,把所有元素的生成函数卷一下就是答案。但是这样最坏情况为 \(O(nm\log n)\)的,不能通过这道题。

在思考优化方式时,容易想到启发式合并来优化这个过程。但是启发式合并本质上就是对分治的同一层区间进行无序合并,二者复杂度相同,故而我采取了比较好写的分治。

点击查看代码
#include <bits/stdc++.h>
namespace Poly{
    constexpr int N = 2.7e5 + 10;
    constexpr double Pi = acos(-1);
    int n, m, p[N];
    std::complex<double> f[N], g[N];
    void FFT(int n, std::complex<double> *c, int x = 1){
        for(int i = 0; i < n; ++i) if(i < p[i]) std::swap(c[i], c[p[i]]);
        for(int b = 2, k = 1; b <= n; b <<= 1, k <<= 1){
            std::complex<double> t(cos(2 * Pi / b), sin(2 * Pi / b) * x), w(1, 0);
            for(int i = 0; i < n; i += b, w = 1){
                for(int j = 0; j < k; ++j, w *= t){
                    c[i + j] += c[i + j + k] * w;
                    c[i + j + k] = c[i + j] - c[i + j + k] * w - c[i + j + k] * w;
                }
            }
        }
    }
    std::vector<double> Convolution(const auto &a, const auto &b){
        if(!a.size() || !b.size()) return std::vector<double>();
        n = a.size(), m = b.size();
        int l = 1 << (int)ceil(log2(n + m - 1));
        for(int i = 0; i < l; ++i){
            f[i] = i < n? a[i] : 0, g[i] = i < m? b[i] : 0;
            p[i] = (p[i >> 1] >> 1) | (i & 1? l >> 1 : 0);
        }
        n += m - 1, FFT(l, f), FFT(l, g);
        for(int i = 0; i < l; ++i) f[i] *= g[i];
        FFT(l, f, -1); std::vector<double> ret;
        for(int i = 0; i < n; ++i)
            ret.emplace_back(f[i].real() / l);
        return ret;
    }
}
#define FL(i, a, b) for(int i = (a); i <= (b); ++i)
#define FR(i, a, b) for(int i = (a); i >= (b); --i)
typedef std::vector<int> vi;
using Poly::Convolution;
constexpr int N = 2e5 + 10, P = 1009;
int n, m, k, cnt[N];
vi Solve(int l, int r){
    if(l == r) return vi(cnt[l] + 1, 1);
    int mid = l + r >> 1;
    vi t1 = Solve(l, mid), t2 = Solve(mid + 1, r), ret;
    auto t = Convolution(t1, t2);
    for(auto x: t) ret.emplace_back((long long)round(x) % P);
    vi().swap(t1), vi().swap(t2), std::vector<double>().swap(t);
    return move(ret);
}
int main(){
    scanf("%d%d%d", &n, &m, &k); int x;
    FL(i, 1, n) scanf("%d", &x), ++cnt[x];
    vi ans = Solve(1, m);
    printf("%d\n", ans[k]);
    return 0;
}

标签:std,return,Lightsabers,int,vi,hard,ret,vector,CF958F3
From: https://www.cnblogs.com/zac2010/p/17889512.html

相关文章

  • T403510 平面划分(Hard) 题解
    LinkT403510平面划分(Hard)Question平面上由\(n\)条这样的折线所界定区域的最大的个数\(Z_n\)是多少。Solution先思考一个简单的问题平面上\(n\)条直线所界定的区域最大个数\(L_n\)是多少?我们考虑假设已经有\(n-1\)条直线,我们需要画一条直线,这条直线最多和\(n......
  • CodeForces 1497E2 Square-free division (hard version)
    洛谷传送门CF传送门感觉和CF1889C2Doremy'sDryingPlan(HardVersion)有异曲同工之妙。显然去除每个数的平方因子后,两个数相乘为完全平方数当且仅当它们相等。考虑若确定了分段方案,那么修改次数就是,每一段重复出现的数的个数。那么我们设\(f_{i,j}\)为\([1,i]\)......
  • CF1163B2 Cat Party (Hard Edition) 题解
    题意:思路:对于满足条件的区间$[1,x]$,有如下三种情况:$1$.所有元素出现次数都为$1$;$2$.除了一个元素出现次数为$1$之外,其余元素出现次数都相等;$3$.除了一个出现次数比其他数的出现次数多$1$的元素之外,其余元素出现次数都相等。在线处理:设$cnt_i......
  • CF1846E2 Rudolf and Snowflakes (hard version) 题解
    题意:\(T\)\((\)\(1\)\(\le\)\(T\)\(\le\)\(10^4\)\()\)组询问:是否存在一个满\(k\)(\(k\)\(\ge\)\(2\)\()\)叉树节点数恰好为\(n\)\((\)\(1\)\(\le\)\(n\)\(\le\)\(10^{18}\)\()\),且深度\(depth\)至少为\(2\)。思路:满$k$......
  • D2. Xor-Subsequence (hard version)
    D2.Xor-Subsequence(hardversion)Itisthehardversionoftheproblem.Theonlydifferenceisthatinthisversion$a_i\le10^9$.Youaregivenanarrayof$n$integers$a_0,a_1,a_2,\ldotsa_{n-1}$.Bryapwantstofindthelongestbeautifulsub......
  • ShardingSphere学习笔记
    MySQL7的root密码校验方式:mysql_native_passwordMySQL8的root密码校验方式:caching_sha2_password将mysql8的root密码校验方式改为7的:ALTERUSER'root'@'%'IDENTIFIEDWITHmysql_native_passwordBY'123456'; 进入docker容器:防止中文显示乱码:dockerexec-itxxx-na......
  • sharding分表应用笔记(四)——踩坑记录
    sharding分表应用笔记(四)——踩坑记录(更新中)目录sharding分表应用笔记(四)——踩坑记录(更新中)1sql语句使用时不带分表关键字段2在事务中触发数据源路由1sql语句使用时不带分表关键字段如果不带分表关键字段,会默认进行全节点域遍历。如果没有预先创建所有的表节点,会报错提示找不......
  • Mybatis-Plus集成Sharding-JDBC与Flyway实现多租户分库分表
    背景公司产品部收到了一些重要客户的需求,他们希望能够依赖独立的数据库存储来支持他们的业务数据。与此同时,仍有许多中小客户,可以继续使用公共库以满足其需求。技术实现方面,此前持久层框架使用的Mybatis-plus,部分业务场景使用到了Sharding-JDBC用于分表,另外,我们的数据库版本控制工......
  • Mybatis-Plus集成Sharding-JDBC与Flyway实现多租户分库分表
    背景公司产品部收到了一些重要客户的需求,他们希望能够依赖独立的数据库存储来支持他们的业务数据。与此同时,仍有许多中小客户,可以继续使用公共库以满足其需求。技术实现方面,此前持久层框架使用的Mybatis-plus,部分业务场景使用到了Sharding-JDBC用于分表,另外,我们的数据库版本控制......
  • sharding分表应用笔记(三)——多数据源路由
    sharding分表应用笔记(三)——多数据源路由目录sharding分表应用笔记(三)——多数据源路由1背景2配置2.1命名空间配置2.2spring-jdbc路由配置3指定路由3.1自定义注解3.2功能实现3.3用例1背景应用背景:物理数据源只有一个;对于部分数据量大的表实行按月分表处理,其他的表仍然......