首页 > 其他分享 >abc358E Alphabet Tiles

abc358E Alphabet Tiles

时间:2024-10-20 17:45:30浏览次数:1  
标签:std Tiles ifac int Alphabet i64 vector abc358E MInt

现有大写英文字母A-Z,个数分别为C[i],总共可以组成多少个长度在[1,K]之间的不同串?答案对998244353取模。
1<=K<=1000, 0<=C[i]<=1000

分析:记dp[i][k]表示前i类字母构成长度为k的不同方案数,枚举第i类字母的个数j进行转移。

#include <bits/stdc++.h>
using i64 = long long;

template<int MOD>
struct MInt {
    i64 x;
    int norm(i64 u) const {u%=MOD; if(u<0) u+=MOD; return u;}
    MInt(i64 v=0):x(norm(v)) {}
    int val() const {return x;}
    MInt operator-() const {return MInt(norm(MOD-x));}
    MInt inv() const {assert(x!=0); return power(MOD-2);}
    MInt &operator*=(const MInt &o) {x=norm(x*o.x); return *this;}
    MInt &operator+=(const MInt &o) {x=norm(x+o.x); return *this;}
    MInt &operator-=(const MInt &o) {x=norm(x-o.x); return *this;}
    MInt &operator/=(const MInt &o) {*this *= o.inv(); return *this;}
    friend MInt operator*(const MInt &a, const MInt &b) {MInt ans=a; ans*=b; return ans;}
    friend MInt operator+(const MInt &a, const MInt &b) {MInt ans=a; ans+=b; return ans;}
    friend MInt operator-(const MInt &a, const MInt &b) {MInt ans=a; ans-=b; return ans;}
    friend MInt operator/(const MInt &a, const MInt &b) {MInt ans=a; ans/=b; return ans;}
    friend std::istream &operator>>(std::istream &is, MInt &a) {i64 u; is>>u; a=MInt(u); return is;}
    friend std::ostream &operator<<(std::ostream &os, const MInt &a) {os<<a.val(); return os;}
    MInt power(i64 b) const {i64 r=1, t=x; while(b){if(b&1) r=r*t%MOD; t=t*t%MOD; b/=2;} return MInt(r);}
};
using mint = MInt<998244353>;

std::vector<mint> fac, ifac;
struct Comb {
    void init(int n) {
        fac.assign(n + 1, 1);
        for (int i = 1; i <= n; i++) {
            fac[i] = fac[i - 1] * i;
        }
        ifac.resize(n + 1);
        ifac[n] = fac[n].inv();
        for (int i = n - 1; i >= 0; i--) {
            ifac[i] = ifac[i + 1] * (i + 1);
        }
    }
    int operator()(int n, int k) {
        assert(n <= fac.size());
        mint ans = fac[n] * ifac[k] * ifac[n - k];
        return ans.val();
    }
}comb;

void solve() {
	int K;
	std::cin >> K;
	std::vector<int> C(27);
	for (int i = 1; i <= 26; i++) {
		std::cin >> C[i];
	}

	std::vector<std::vector<mint>> dp(27, std::vector<mint>(K + 1));
	for (int i = 0; i <= 26; i++) {
		dp[i][0] = 1;
	}
	for (int i = 1; i <= 26; i++) {
		for (int k = 1; k <= K; k++) {
			for (int j = 0; j <= std::min(C[i], k); j++) {
				dp[i][k] += dp[i - 1][k - j] * comb(k, j);
			}
		}
	}

	mint ans = 0;
	for (int k = 1; k <= K; k++) {
		ans += dp[26][k];
	}
	std::cout << ans << "\n";
}

int main() {
	std::cin.tie(0)->sync_with_stdio(0);
	comb.init(1000);
	int t = 1;
	while (t--) solve();
	return 0;
}

标签:std,Tiles,ifac,int,Alphabet,i64,vector,abc358E,MInt
From: https://www.cnblogs.com/chenfy27/p/18487544

相关文章

  • 比CesiumLab还好用的工具:免费的倾斜摄影OSGB/3Dtiles编辑转换发布平台
    GIS数据处理工具在现代技术与应用中扮演着至关重要的角色,它们不仅是连接原始地理信息与可分析、可视化数据的桥梁,更是推动地理信息系统(GIS)在各个行业领域深入发展与应用不可或缺的关键工具。选择一款合适的工具直接关系到数据处理、分析和展示的效率和精度,本文将对比GISBox、Ce......
  • 鸿蒙(Harmony) NEXT - AlphabetIndexer实现联系人字母索引
    鸿蒙(Harmony)NEXT9月份就要正式上架了,并且不会再兼容安卓平台,于是我也赶紧给App开发鸿蒙版本,接下来会写一系列的Harmony开发教程。今天使用AlphabetIndexer实现联系人字母索引,AlphabetIndexer是官方封装好的组件咱们实现后的效果图:代码实现首先在aboutToAppear方法中初始......
  • mapbox 结合deckgl添加3DTiles等操作
    1.初始化import{MapboxOverlay}from"@deck.gl/mapbox";import{LineLayer,GeoJsonLayer}from"@deck.gl/layers"; import{TripsLayer,Tile3DLayer}from"@deck.gl/geo-layers"; import{Tiles3DLoader}from"@loade......
  • Cesium实战功能教程之3dtiles操作(移动+旋转)
    在平常的工作中,难免会用到倾斜摄影,当加载倾斜摄影的时候,最头疼的就是倾斜摄影的偏移问题,在代码中进行修改加载倾斜摄影的偏移参数,虽然简单但过于麻烦,也耽误开发的效率,因此我就本着能不能在三维场景中对倾斜摄影进行手动操作,无需再改代码并可将倾斜摄影放在较为正确的位置。......
  • 一种倾斜摄影网格简化方式:指定LOD层级裁剪输出为FBX/OBJ/OSGB/3DTiles
    工具OSGB源数据灵易智模·倾斜摄影编辑平台(下称OPEditor)引言指定LOD层级与网格简化的关系倾斜摄影模型本身就是通过逐级简化点云得到的分页金字塔数据,因此它每一级都是下一级的网格简化结果,且算法成熟、结果可控;通过在导出即输出数据时,设置源数据的最大参考层级来直接......
  • Android 14 适配之— BluetoothAdapter、JobScheduler、 Tiles
    1. BluetoothAdapter改动:在BluetoothAdapter中必须加入 BLUETOOTH_CONNECT权限 Android14(API级别34)或更高版本为目标的App,在调用函数 BluetoothAdapter getProfileConnectionState() 时,需要 BLUETOOTH_CONNECT 权限,<uses-permissionandroid:name="android......
  • SciTech-Mathematics-Probability+Statistics-Descriptive stats + percentiles in nu
    DescriptiveStats+percentilesinnumpyandscipy.statshttps://dev.to/sayemmh/descriptive-stats-percentiles-in-numpy-and-scipystats-59a7DEVCommunitySayemHoque,PostedonOct13,2022•UpdatedonNov16,2022Descriptivestats+percentilesinnumpy......
  • 题解:2024牛客多校赛第二场 A Floor Tiles(思维)
    2024NowcoderMulti-UniversityTrainingContest2ProblemA.FloorTiles题目大意给你两种正方形图案,分别为以下两种:再给你三个整数\(N,M,K\),表示你需要用这两种图案,拼成一个\(N\)列\(M\)行的矩形。由于这两种图案十分特殊,他们能无缝衔接在一起。因此你需要让这个矩......
  • MapLibre/Martin | 使用Martin发布MBTiles地图切片包
    什么是MartinMartin是一个高性能的地图切片服务器,使用Rust编写,支持PostGIS,MBTiles,PMTiles。什么是MBTilesMBTiles是个sqlite文件,也就是说MBTiles文件是个单文件数据库。截至本文写作时,最新标准是1.3.MBTIles利用了数据库的索引机制,避免相同内容的切片重复占用空间,同时也有......
  • Cesium 3DTiles customshader的使用-动态高度设置
    之前要编辑3DTiles 的shader来实现一些例如压平之类的操作 还需要更改源码Cesium新版本更新了3Dtiles的自定义着色器 可以直接定义两个着色器并往里面传uniform新版本添加3dtiles的方式发生了改变 原有的方式不能用了新版本必须通过fromurl函数进行异步添加即asyncfu......