[hdu7023]Yet Another Matrix Problem
关于$f(x)$的条件,将$C=A\times B$代入,即$\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{k=1}^{r}A_{i,k}B_{k,j}=x$
调换枚举顺序,即$\sum_{k=1}^{r}(\sum_{i=1}^{n}A_{i,k})(\sum_{j=1}^{n}B_{k,j})=x$
显然每一部分的值都是独立的,因此令$G_{x}$为$(\sum_{i=1}^{n}A_{i,k})(\sum_{j=1}^{n}B_{k,j})=x$的方案数,枚举其中一项的值并对$x$是否为0分类讨论,那么不难得到有$G_{x}=\begin{cases}2(m+1)^{n}-1&(x=0)\\\sum_{d\mid x}{d+n-1\choose n-1}{\frac{x}{d}+n-1\choose n-1}&(x\ge 1)\end{cases}$
令$G_{x}$对应的生成函数为$G(t)=\sum_{x\ge 0}G_{x}t^{x}$,那么答案即为$[t^{x}]G^{r}(t)$(指$G^{r}(t)$的$x$次项系数),
根据调和级数,可以$o(m\log m)$求出$G_{x}$,$G^{r}(t)$利用多项式求幂也可以做到$o(m\log m)$
最终,总复杂度为$o(m\log m)$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define L 18
5 #define mod 998244353
6 #define ll long long
7 #define vi vector<int>
8 #define Add(x,y) (x+y<mod ? x+y : x+y-mod)
9 #define Sub(x,y) (x>=y ? x-y : x-y+mod)
10 int t,n,m,fac[N],inv[N];
11 vi v;
12 int C(int n,int m){
13 return (ll)fac[n]*inv[m]%mod*inv[n-m]%mod;
14 }
15 int qpow(int n,int m,int Mod=mod){
16 int s=n,ans=1;
17 while (m){
18 if (m&1)ans=(ll)ans*s%Mod;
19 s=(ll)s*s%Mod;
20 m>>=1;
21 }
22 return ans;
23 }
24 namespace Poly{
25 int inv[1<<L],rev[1<<L],S[2][L][1<<L];
26 void init(){
27 inv[0]=inv[1]=1;
28 for(int i=2;i<(1<<L);i++)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
29 for(int i=0;i<L;i++){
30 int s=qpow(3,(mod-1>>i+1)),ss=qpow(s,mod-2);
31 S[0][i][0]=S[1][i][0]=1;
32 for(int j=1;j<(1<<i);j++){
33 S[0][i][j]=(ll)s*S[0][i][j-1]%mod;
34 S[1][i][j]=(ll)ss*S[1][i][j-1]%mod;
35 }
36 }
37 }
38 vi Get(int num){
39 vi ans;
40 ans.push_back(num);
41 return ans;
42 }
43 vi add(vi a,vi b,int n){
44 a.resize(n);
45 for(int i=0;(i<n)&&(i<b.size());i++)a[i]=Add(a[i],b[i]);
46 return a;
47 }
48 vi sub(vi a,vi b,int n){
49 a.resize(n);
50 for(int i=0;(i<n)&&(i<b.size());i++)a[i]=Sub(a[i],b[i]);
51 return a;
52 }
53 vi mul(vi a,int x,int n){
54 a.resize(n);
55 for(int i=0;(i<n)&&(i<a.size());i++)a[i]=(ll)x*a[i]%mod;
56 return a;
57 }
58 vi Int(vi a,int n){
59 a.resize(n);
60 for(int i=n-1;i;i--)a[i]=(ll)inv[i]*a[i-1]%mod;
61 a[0]=0;
62 return a;
63 }
64 vi derive(vi a,int n){
65 a.resize(n);
66 for(int i=1;i<n;i++)a[i-1]=(ll)i*a[i]%mod;
67 a[n-1]=0;
68 return a;
69 }
70 void ntt(vi &a,int n,int p){
71 for(int i=0;i<n;i++)
72 if (i<rev[i])swap(a[i],a[rev[i]]);
73 for(int i=2,ii=0;i<=n;i<<=1,ii++)
74 for(int j=0;j<n;j+=i)
75 for(int k=0;k<(i>>1);k++){
76 int x=a[j+k],y=(ll)S[p][ii][k]*a[j+k+(i>>1)]%mod;
77 a[j+k]=Add(x,y),a[j+k+(i>>1)]=Sub(x,y);
78 }
79 if (p)a=mul(a,qpow(n,mod-2),n);
80 }
81 vi mul(vi a,vi b,int n){
82 int m=0;
83 while ((1<<m)<min(n,(int)a.size())+min(n,(int)b.size()))m++;
84 m=(1<<m),a.resize(m),b.resize(m);
85 for(int i=n;i<m;i++)a[i]=b[i]=0;
86 for(int i=0;i<m;i++)rev[i]=(rev[i>>1]>>1)+(i&1)*(m>>1);
87 ntt(a,m,0),ntt(b,m,0);
88 for(int i=0;i<m;i++)a[i]=(ll)a[i]*b[i]%mod;
89 ntt(a,m,1);
90 while (a.size()>n)a.pop_back();
91 return a;
92 }
93 vi Inv(vi a,int n){
94 if (n==1)return Get(qpow(a[0],mod-2));
95 vi ans=Inv(a,n+1>>1);
96 return sub(mul(ans,2,n),mul(a,mul(ans,ans,n),n),n);
97 }
98 vi ln(vi a,int n){
99 return Int(mul(derive(a,n),Inv(a,n),n),n);
100 }
101 vi exp(vi a,int n){
102 if (n==1)return Get(1);
103 vi ans=exp(a,n+1>>1);
104 return mul(ans,sub(add(a,Get(1),n),ln(ans,n),n),n);
105 }
106 vi Qpow(vi a,int n,int m,int mm){
107 int s=a[0];
108 assert(s);
109 a=mul(a,qpow(s,mod-2),n);
110 return mul(exp(mul(ln(a,n),m,n),n),qpow(s,mm),n);
111 }
112 }
113 int main(){
114 fac[0]=inv[0]=inv[1]=1;
115 for(int i=1;i<N;i++)fac[i]=(ll)fac[i-1]*i%mod;
116 for(int i=2;i<N;i++)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
117 for(int i=1;i<N;i++)inv[i]=(ll)inv[i-1]*inv[i]%mod;
118 Poly::init();
119 scanf("%d",&t);
120 while (t--){
121 scanf("%d%d",&n,&m);
122 v.clear(),v.resize(++m);
123 v[0]=(2*qpow(m,n)-1)%mod;
124 for(int i=1;i<m;i++)
125 for(int j=i;j<m;j+=i)v[j]=(v[j]+(ll)C(i+n-1,n-1)*C(j/i+n-1,n-1))%mod;
126 v=Poly::Qpow(v,m,qpow(n,m-1),qpow(n,m-1,mod-1));
127 for(int i=0;i<m;i++)printf("%d\n",v[i]);
128 }
129 return 0;
130 }
[hdu7023]Yet Another Matrix Problem的更多相关文章
- THE MATRIX PROBLEM
THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 3666.THE MATRIX PROBLEM 差分约束系统
THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 3666 THE MATRIX PROBLEM (差分约束 深搜 & 广搜)
THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- hdoj--3666--THE MATRIX PROBLEM(差分约束+SPFA深搜)
THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU3666 THE MATRIX PROBLEM (差分约束+取对数去系数)(对退出情况存疑)
You have been given a matrix C N*M, each element E of C N*M is positive and no more than 1000, The p ...
- HDU3666-THE MATRIX PROBLEM(差分约束-不等式解得存在性判断 对数转化)
You have been given a matrix C N*M, each element E of C N*M is positive and no more than 1000, The p ...
- 差分约束系统+(矩阵)思维(H - THE MATRIX PROBLEM HDU - 3666 )
题目链接:https://cn.vjudge.net/contest/276233#problem/H 题目大意:对于给定的矩阵 每一行除以ai 每一列除以bi 之后 数组的所有元素都还在那个L- ...
- HDU 3666 THE MATRIX PROBLEM (差分约束,最短路)
题意: 给一个n*m矩阵,每个格子上有一个数字a[i][j],给定L和U,问:是否有这样两个序列{a1...an}和{b1...bn},满足 L<=a[i][j]*ai/bj<=U .若存 ...
- HDU 3666 THE MATRIX PROBLEM (差分约束)
题意:给定一个最大400*400的矩阵,每次操作可以将某一行或某一列乘上一个数,问能否通过这样的操作使得矩阵内的每个数都在[L,R]的区间内. 析:再把题意说明白一点就是是否存在ai,bj,使得l&l ...
随机推荐
- Java类加载器概述
Java类加载器概述 Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由Java 应用开发人员编写的. 系统提供的类加载器 引导类加载器 它用来加载 Java 的核心库,是用原生 ...
- 手把手教你 Docker部署可视化工具Grafana
一.Grafana的简单介绍 Grafana是开源的.炫酷的可视化监控.分析利器,无论您的数据在哪里,或者它所处的数据库是什么类型,您都可以将它与Grafana精美地结合在一起.它还有丰富的套件供您选 ...
- 3D渲染
3d渲染的本质是在三维坐标系中绘制很三角形,用三角形拼成物体,然后投影到二维图像上,所以做渲染就是画好这些三角形;3d渲染输入的是很多三角形的3个顶点和属性,输出的是一张2d图.画好三角形要研究给三角 ...
- Java(29)集合四Collections
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228439.html 博客主页:https://www.cnblogs.com/testero ...
- Java:Object对象小记
Java:Object对象小记 对 Java 中的 Object 对象,做一个微不足道的小小小小记 Object 的常用方法有哪些 clone() 方法:用于创建并返回当前对象的一份拷贝: 在Java ...
- [Beta]the Agiles Scrum Meeting 1
会议时间:2020.5.9 21:00 1.每个人的工作 今天已完成的工作 讨论转会事项 经过组内成员的讨论,我们做出了非常艰难的决定:我们的组员老c将作为转会成员,离开我们的团队.感谢老c在Alph ...
- Prometheus基于文件的服务发现
Prometheus基于文件的服务发现 一.基于文件的服务发现 1.prometheus.yml 配置文件的写法 2.file_sd 目录下的文件 3.配置结果 二.注意事项 三.参考链接 一.基于文 ...
- 色彩滤镜矩阵(Color Filter Array)
数码相机上的每个象素都带有一个光感应器,用以测量光线的明亮程度.由于光电二极管是只支持单颜色的装置,它不能区别不同波长的光线.因此,数码相机工程师在相机感应器的上部装上了一套镶嵌式的颜色滤镜,一个颜色 ...
- Spring Cache 带你飞(一)
Spring 3.1 版本引入基于 annotation 的 cache 技术,提供了一套抽象的缓存实现方案,通过注解方式使用缓存,基于配置的方式灵活使用不同缓存组件.代码具有相当的灵活性和扩展性,本 ...
- hdu 1166 敌兵布阵(单点更新,区间查询)
题意: N个工兵营地.工兵营地里的人数分别为:a1,a2,....aN Add i,j:第i个工兵营地里增加j人 Sub i,j:第i个工兵营地里减少j人 Query i,j:查询第i个第j个工兵营地 ...