[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 ...
随机推荐
- 小白自制Linux开发板 三. Linux内核与文件系统移植
上一篇完成了uboot的移植,但是想要愉快的在开发板上玩耍还需要移植Linux内核和文件系统. 1.Linux内核 事实上对于F1C100S/F1C200S,Linux官方源码已经对licheepi ...
- 题解 Beautiful Pair
题目传送门 题目大意 给出一个 \(n\) 个点的序列 \(a_{1,2,...,n}\) ,问有多少对点对 \((i,j)\) 满足 \(a_i\times a_j\le a_k(i\le k\le ...
- 2020.10.9--vj个人赛补题
B - A Tide of Riverscape 题意:给出一组字符串,由'0','1',' . '组成,' . '可以换成 0或1,判断第 i 个和第 i+p 个字符是否可以不相等,如果可以则输出 ...
- C 标准库函数手册摘要
<stdlib.h> int abs( int value ); long int labs( long int value ); 返回参数的绝对值 int rand( void ); v ...
- PAT (Basic Level) Practice (中文)1025 反转链表 (25分)
1025 反转链表 (25分) 给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→ ...
- ❤️这应该是Postman最详细的中文使用教程了❤️(新手使用,简单明了)
️这应该是Postman最详细的中文使用教程了️(新手使用,简单明了) 在前后端分离开发时,后端工作人员完成系统接口开发后,需要与前端人员对接,测试调试接口,验证接口的正确性可用性.而这要求前端开发进 ...
- Mybatis、maven项目中整合log4j (17)
Mybatis.maven项目总整合log4j java 中Mybatis.maven项目总整合log4j 1.pom增加log4j包引用 2.添加 log4j.properties文件 # java ...
- 【技术博客】利用handler实现线程之间的消息传递
[技术博客]利用handler实现线程之间的消息传递 一.handler简介 在Android Studio的开发中,经常需要启动多个线程.比如向远程发送请求时,必须新开一个子线程,否则会造成程序崩溃 ...
- Beta阶段第四次会议
Beta阶段第四次会议 时间:2020.5.20 完成工作 姓名 工作 难度 完成度 ltx 1.对小程序进行修改2.提出相关api修改要求 轻 85% xyq 1.设计所需api文档2.编写相关技术 ...
- BUAA 2020 软件工程 软件分析案例作业
Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件分析案例 我在这个课程的目标是 学习软件 ...