luogu4389 付公主的背包

题目链接:洛谷

题目大意:现在有$n$个物品,每种物品体积为$v_i$,对任意$s\in [1,m]$,求背包恰好装$s$体积的方案数(完全背包问题)。

数据范围:$n,m\leq 10^5$


这道题,看到数据范围就知道是生成函数。
$$Ans=\prod_{i=1}^n\frac{1}{1-x^{v_i}}$$

但是这个式子直接乘会tle,我们考虑进行优化。

看见这个连乘的式子,应该是要上$\ln$.

$$Ans=\exp(\sum_{i=1}^n\ln(\frac{1}{1-x^{v_i}}))$$

接下来的问题就是如何快速计算$\ln(\frac{1}{1-x^{v_i}})$。

$$\ln(f(x))=\int f'f^{-1}dx$$

所以
$$\ln(\frac{1}{1-x^v})=\int\sum_{i=1}^{+\infty}vix^{vi-1}*(1-x^v)dx$$
$$=\int(\sum_{i=1}^{+\infty}vix^{vi-1}-\sum_{i=2}^{+\infty}v(i-1)x^{vi-1})dx$$
$$=\int(\sum_{i=1}^{+\infty}vx^{vi-1})dx$$
$$=\sum_{i=1}^{+\infty}\frac{1}{i}x^{vi}$$

然后就可以直接代公式了。

  1 #include<cstdio>
  2 #include<algorithm>
  3 #define Rint register int
  4 using namespace std;
  5 typedef long long LL;
  6 const int N = 400003, P = 998244353, G = 3, Gi = 332748118;
  7 int n, m, cnt[N], A[N];
  8 inline int kasumi(int a, int b){
  9     int res = 1;
 10     while(b){
 11         if(b & 1) res = (LL) res * a % P;
 12         a = (LL) a * a % P;
 13         b >>= 1;
 14     }
 15     return res;
 16 }
 17 int R[N];
 18 inline void NTT(int *A, int limit, int type){
 19     for(Rint i = 1;i < limit;i ++)
 20         if(i < R[i]) swap(A[i], A[R[i]]);
 21     for(Rint mid = 1;mid < limit;mid <<= 1){
 22         int Wn = kasumi(type == 1 ? G : Gi, (P - 1) / (mid << 1));
 23         for(Rint j = 0;j < limit;j += mid << 1){
 24             int w = 1;
 25             for(Rint k = 0;k < mid;k ++, w = (LL) w * Wn % P){
 26                 int x = A[j + k], y = (LL) w * A[j + k + mid] % P;
 27                 A[j + k] = (x + y) % P;
 28                 A[j + k + mid] = (x - y + P) % P;
 29             }
 30         }
 31     }
 32     if(type == -1){
 33         int inv = kasumi(limit, P - 2);
 34         for(Rint i = 0;i < limit;i ++)
 35             A[i] = (LL) A[i] * inv % P;
 36     }
 37 }
 38 int ans[N];
 39 inline void poly_inv(int *A, int deg){
 40     static int tmp[N];
 41     if(deg == 1){
 42         ans[0] = kasumi(A[0], P - 2);
 43         return;
 44     }
 45     poly_inv(A, (deg + 1) >> 1);
 46     int limit = 1, L = -1;
 47     while(limit <= (deg << 1)){limit <<= 1; L ++;}
 48     for(Rint i = 1;i < limit;i ++)
 49         R[i] = (R[i >> 1] >> 1) | ((i & 1) << L);
 50     for(Rint i = 0;i < deg;i ++) tmp[i] = A[i];
 51     for(Rint i = deg;i < limit;i ++) tmp[i] = 0;
 52     NTT(tmp, limit, 1); NTT(ans, limit, 1);
 53     for(Rint i = 0;i < limit;i ++)
 54         ans[i] = (2 - (LL) tmp[i] * ans[i] % P + P) % P * ans[i] % P;
 55     NTT(ans, limit, -1);
 56     for(Rint i = deg;i < limit;i ++) ans[i] = 0;
 57 }
 58 int Ln[N];
 59 inline void get_Ln(int *A, int deg){
 60     static int tmp[N];
 61     poly_inv(A, deg);
 62     for(Rint i = 1;i < deg;i ++)
 63         tmp[i - 1] = (LL) i * A[i] % P;
 64     tmp[deg - 1] = 0;
 65     int limit = 1, L = -1;
 66     while(limit <= (deg << 1)){limit <<= 1; L ++;}
 67     for(Rint i = 1;i < limit;i ++)
 68         R[i] = (R[i >> 1] >> 1) | ((i & 1) << L);
 69     NTT(ans, limit, 1); NTT(tmp, limit, 1);
 70     for(Rint i = 0;i < limit;i ++) Ln[i] = (LL) ans[i] * tmp[i] % P;
 71     NTT(Ln, limit, -1);
 72     for(Rint i = deg + 1;i < limit;i ++) Ln[i] = 0;
 73     for(Rint i = deg;i;i --) Ln[i] = (LL) Ln[i - 1] * kasumi(i, P - 2) % P;
 74     for(Rint i = 0;i < limit;i ++) tmp[i] = ans[i] = 0;
 75     Ln[0] = 0;
 76 }
 77 int Exp[N];
 78 inline void get_Exp(int *A, int deg){
 79     if(deg == 1){
 80         Exp[0] = 1;
 81         return;
 82     }
 83     get_Exp(A, (deg + 1) >> 1);
 84     get_Ln(Exp, deg);
 85     for(Rint i = 0;i < deg;i ++) Ln[i] = (A[i] + (i == 0) - Ln[i] + P) % P;
 86     int limit = 1, L = -1;
 87     while(limit <= (deg << 1)){limit <<= 1; L ++;}
 88     for(Rint i = 1;i < limit;i ++)
 89         R[i] = (R[i >> 1] >> 1) | ((i & 1) << L);
 90     NTT(Exp, limit, 1); NTT(Ln, limit, 1);
 91     for(Rint i = 0;i < limit;i ++) Exp[i] = (LL) Exp[i] * Ln[i] % P;
 92     NTT(Exp, limit, -1);
 93     for(Rint i = deg;i < limit;i ++) Exp[i] = 0;
 94     for(Rint i = 0;i < limit;i ++) Ln[i] = ans[i] = 0;
 95 }
 96 int main(){
 97     scanf("%d%d", &n, &m);
 98     for(Rint i = 1;i <= n;i ++){
 99         int x;
100         scanf("%d", &x);
101         ++ cnt[x];
102     }
103     for(Rint i = 1;i <= m;i ++){
104         if(!cnt[i]) continue;
105         for(Rint j = i;j <= m;j += i)
106             A[j] = (A[j] + (LL) cnt[i] * kasumi(j / i, P - 2) % P) % P;
107     }
108     get_Exp(A, m + 1);
109     for(Rint i = 1;i <= m;i ++)
110         printf("%d\n", Exp[i]);
111 }
luogu4389

 

转载于:https://www.cnblogs.com/AThousandMoons/p/10524935.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git与Github的连接与使用

2019独角兽企业重金招聘Python工程师标准>>> Git与Github的连接与使用 下面继续&#xff0c;使用git 将项目上传到GitHub上 首先要有GitHub账号,这就不用说了&#xff0c;没有的先注册&#xff0c;地址&#xff1a;https://github.com 没有仓库的话&#xff0c;先新…

ttl电路制作pong游戏_如何玩Mozilla Firefox的隐藏的独角兽Pong游戏

ttl电路制作pong游戏It seems like every browser has a hidden game these days. Chrome has a dinosaur game, Edge has surfing, and Firefox has . . . unicorn pong? Yep, you read that right—here’s how to play it. 这些天似乎每个浏览器都有一个隐藏的游戏。 Chrom…

为什么无法运行谷歌play_什么是Google Play积分,以及如何使用它们?

为什么无法运行谷歌playThe Google Play Store is home to thousands of apps, games, movies, e-books, and more. You might find yourself making a lot of purchases there, so why not get rewarded for it? That’s where Google Play Points come in. Google Play商店提…

2019年春季学期第三周作业

本周作业 本周请大家完成上周挑战作业的第一部分&#xff1a;给定一个整数数组(包含正负数)&#xff0c;找到一个具有最大和的子数组&#xff0c;返回其最大的子数组的和。 例如&#xff1a;[1, -2, 3, 10, -4, 7, 2, -5]的最大子数组为[3, 10, -4, 7, 2] 1&#xff09;.实验代…

Linux实验二:linux 常用命令练习

ls命令 列出目录内容 echo命令 显示字符串 date命令 显示或设置系统的日期与时间 cal命令 显示日历 who命令 列出登录用户信息 chown命令 chgrp命令 改变文件所属的用户组 chmod命令 改变文件访问权限 find命令 在目录中搜索文件 转载于:https://www.cnblogs.com/nullno/p/87…

短语密码_使用密码短语以提高安全性

短语密码Did you know that Windows supports using passwords of up to 127 characters? I don’t use passwords anymore, and I haven’t for years. I’ve switched to using password phrases instead. 您知道Windows支持使用最多127个字符的密码吗&#xff1f; 我不再使…

「单点登录与权限管理」系列概述

首先&#xff0c;感谢几位朋友在朋友圈转发我的文章&#xff0c;小声的告诉你们&#xff0c;是我主动让他们帮忙转发的&#xff1a;&#xff09;在朋友们的分享下&#xff0c;凌晨推送的一篇文章&#xff0c;阅读人数达到了280多&#xff0c;很满足&#xff0c;我会坚持写下去&…

进程handle获取线程_获取进程中的线程列表

进程handle获取线程The System.Diagnostics namespace contains functions that allow you to manage processes, threads, eventlogs and performance information. System.Diagnostics命名空间包含允许您管理进程&#xff0c;线程&#xff0c;事件日志和性能信息的函数。 The…

2018-3-28Linux系统管理(16)计算机网络基础

在这一章当中我们讲述计算机网络基础。一、计算机网络网络通信就像人与人之间的交流一样&#xff0c;说同一种语言&#xff0c;而后双方进行无障碍的通信交流&#xff0c;那么两台主机通信时&#xff0c;它们彼此交换数据的格式的前提为互相理解才可以&#xff0c;我们此前也有…

18 南京 D

裸的最小球覆盖。 坐标范围大一些所以我们把初始的温度也设置的大一些。 1 #include <bits/stdc.h>2 using namespace std;3 typedef long long ll;4 typedef double db;5 const db INF 1e100;6 const db delta 0.98;7 const db eps 1e-8;8 struct p3{9 db x,y,z;…

如何在iPhone或iPad的控制中心中控制智能家居设备

Apple’s Home app offers quick controls for controlling smart lights, doorbells, thermostats, and other smart home devices—right in your iPhone or iPad’s Control Center. Here’s how to set it up and use it. Apple的Home应用程序可在iPhone或iPad的控制中心内…

亚信安全与安徽电信共创“云网融合”安全新局面

全面提升公共安全能力 联合推“天翼U盾”保障移动政务安全 在近日举办的安徽“互联网”产业合作峰会上&#xff0c;亚信安全宣布与中国电信安徽公司达成战略合作&#xff0c;双方将在“云网融合”的生态基础上打造特色安全服务、促进政企协同安全监管、共创网络安全平安城市等…

idea中开启Run Dashboard

若没有 下一步 ok 转载于:https://www.cnblogs.com/aijiajia1314/p/10551007.html

电台复活节_如何玩Android 11的隐藏复活节彩蛋游戏

电台复活节Justin Duino贾斯汀杜伊诺(Justin Duino)Google includes a hidden “Easter Egg” with each new Android version. Android 11 has one of the more elaborate Easter Eggs as it’s actually a game you can play. We’ll show you how to find it and play. Goog…

如何在Instagram上过滤冒犯性评论

Shubham AgarwalShubham AgarwalIf you have a public Instagram profile, chances are you’ve been a victim of inappropriate comments from strangers. Given the social network’s vast size, it’s practically impossible to escape such bad actors. Thankfully, Ins…

复杂性思维中文第二版 附录 A、算法分析

附录 A、算法分析 原文&#xff1a;Appendix A Analysis of algorithms 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了《Think Python 2e 中译本 第二十一章&#xff1a;算法分析》 算法分析 (Analysis of algorithms) 是计算机科学的一…

如何在Windows 8.1中获取Windows 10样式的开始菜单

On January 21, Microsoft officially announced the new features that would be included in Windows 10. While you’ll have to wait for the release to enjoy most of the new features, you can take advantage of the new Windows 10 Start menu today. 1月21日&#x…

ubuntu列出所有磁盘_列出Ubuntu上的磁盘空间使用情况

ubuntu列出所有磁盘Simply open a new Terminal window and type in this command 只需打开一个新的终端窗口并输入此命令 df -Th f翻译自: https://www.howtogeek.com/howto/ubuntu/list-disk-space-usage-on-ubuntu/ubuntu列出所有磁盘

python基础之字符编码

阅读目录 一 了解字符编码的知识储备二 字符编码介绍三 字符编码应用之文件编辑器3.1 文本编辑器之nodpad3.2 文本编辑器之pycharm3.3 文本编辑器之python解释器3.4 总结四 字符编码应用之python4.1 执行python程序的三个阶段4.2 python2与python3字符串类型的区别一 了解字符编…

C# WinForm开发系列 - DataGridView

1.DataGridView实现课程表 testcontrol.rar 2.DataGridView二维表头及单元格合并 DataGridView单元格合并和二维表头.rar myMultiColHeaderDgv.rar 3.DataGridView单元格显示GIF图片 gifanimationindatagrid.rar 4.自定义显示DataGridView列(行头显示行号与图标,同一单元格显示…