关于$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的更多相关文章

  1. THE MATRIX PROBLEM

    THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  2. HDU 3666.THE MATRIX PROBLEM 差分约束系统

    THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  3. HDU 3666 THE MATRIX PROBLEM (差分约束 深搜 & 广搜)

    THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  4. hdoj--3666--THE MATRIX PROBLEM(差分约束+SPFA深搜)

    THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  5. 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 ...

  6. 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 ...

  7. 差分约束系统+(矩阵)思维(H - THE MATRIX PROBLEM HDU - 3666 )

    题目链接:https://cn.vjudge.net/contest/276233#problem/H 题目大意:对于给定的矩阵  每一行除以ai  每一列除以bi 之后 数组的所有元素都还在那个L- ...

  8. HDU 3666 THE MATRIX PROBLEM (差分约束,最短路)

    题意: 给一个n*m矩阵,每个格子上有一个数字a[i][j],给定L和U,问:是否有这样两个序列{a1...an}和{b1...bn},满足 L<=a[i][j]*ai/bj<=U .若存 ...

  9. HDU 3666 THE MATRIX PROBLEM (差分约束)

    题意:给定一个最大400*400的矩阵,每次操作可以将某一行或某一列乘上一个数,问能否通过这样的操作使得矩阵内的每个数都在[L,R]的区间内. 析:再把题意说明白一点就是是否存在ai,bj,使得l&l ...

随机推荐

  1. Semi-supervised semantic segmentation needs strong, varied perturbations

    论文阅读: Semi-supervised semantic segmentation needs strong, varied perturbations 作者声明 版权声明:本文为博主原创文章,遵 ...

  2. caffe运行错误 target_blobs.blobs_size()与 source_layer.blobs_size() 不一致

    解决方法参考:http://blog.csdn.net/zhangla1220/article/details/50697352 感谢博主!!! 最新下载的caffe代码,运行mnist,训练时可以正 ...

  3. 在Vue&Element前端项目中,对于字典列表的显示处理

    在很多项目开发中,我们为了使用方便,一般都会封装一些自定义组件来简化界面的显示处理,例如参照字典的下拉列表显示,是我们项目中经常用到的功能之一,本篇随笔介绍在Vue&Element前端项目中如 ...

  4. python常用功能

    1. 获取昨天日期 引入datetime模块 import datetime def getYesterday(): today = datetime.date.today() #返回当前本地日期 # ...

  5. 【UE4 设计模式】组件模式 Components Pattern

    概述 描述 在单一实体跨越了多个领域时,为了保持领域之间相互解耦,可以将每部分代码放入各自的组件类中,将实体简化为组件的容器. 套路 参考 UE4中的 Componet 组件使用方式 使用场景 有一个 ...

  6. 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列

    概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...

  7. pagelayout中边界灵敏度动画时间kv

    <PageLayoutWidget>: # 默认是50dp 设置边界 border:'100dp' # 默认哪一页 page:2 # 设置翻页动画及持续时间 anim_kwargs:{'d ...

  8. MySQL:基础语法-4

    MySQL:基础语法-4 记录一下 MySQL 基础的一些语法,便于查询,该部分内容主要是参考:bilibili 上 黑马程序员 的课程而做的笔记,由于时间有点久了,课程地址忘记了 上文MySQL:基 ...

  9. Ajax配合后端实现Excel的导出

    一.需求 在我们的日常开发中,可能经常需要遇到excel的导出,以往excel的导出服务器端都是使用的 GET 方法,但是某些情况下,服务器端只能使用 POST 方法,那么我们有没有好的方法实现exc ...

  10. 零基础小白要如何跟好的学习嵌入式Linux

    作为一个新人,怎样学习嵌入式Linux?被问过太多次,特写这篇文章来回答一下. 在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会). C语言要学 ...