hdu 6399 City Development
读进来可能会有相同的\(n_i\),不过在相同的\(n_i\)中只有最后一个是有用的,所以其他的要缩起来,缩完后这些\(n\)的数量不会超过19个
可以发现一个城市的答案为所有城市初始权值的线性组合,然后对于\(x\),其他和\(x\)gcd深度相同的点转移系数都是一样的,因为gcd深度相同那么转移也是本质相同的
那么考虑构造转移矩阵,\(a_{i,j}\)表示gcd深度为\(i\)转移到深度为\(j\)的方案数,那么答案即为\(ans_x=\sum_{i=1}^{n} d_x {f^T}_{\gcd(x,i),m}\)(当然gcd相同的要一起统计)
先考虑\(i\neq j\)的情况,这个时候无论是哪个点对转移系数都是\(p_{\min(i,j)}\),然后还要乘上gcd深度为\(j\)的点数,即为\(p_{\min(i,j)}(n_j-n_{j+1})\)
然后是\(i=j\)的情况.可以发现从一个深度为\(i\)的点到深度相同的点,这两点之间的lca深度有\(m,m-1,m-2...i\).对于\(>i\)的部分,这些是和\(i\neq j\)类似的,即\(\sum_{k=i+1}^{m} p_{k}(n_k-n_{k+1})\).但如果是\(=i\),那么可以到达的点数是多了\(n_{i+1}\)的,这一部分也是到\(x\)gcd深度\(>i\)的部分,所以这部分为\(p_{i}(n_i-2n_{i+1})\)
//以下是在laji hduPE的代码
#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db long double
using namespace std;
const int N=3e5+10,mod=998244353;
LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
};
int n,m,d[N],c[N];
LL T,a[N];
struct matrix
{
int a[22][22];
matrix(){memset(a,0,sizeof(a));}
matrix operator * (const matrix &bb) const
{
matrix an;
for(int i=0;i<=m;++i)
for(int j=0;j<=m;++j)
{
LL nw=0;
for(int k=0;k<=m;++k) nw+=1ll*a[i][k]*bb.a[k][j]%mod;
an.a[i][j]=nw%mod;
}
return an;
}
matrix operator ^ (const LL &bb) const
{
matrix an,a=*this;
for(int i=0;i<=m;++i) an.a[i][i]=1;
LL b=bb;
while(b)
{
if(b&1) an=an*a;
a=a*a,b>>=1;
}
return an;
}
}bb;
int main()
{
int K=rd();
while(K--)
{
memset(bb.a,0,sizeof(bb.a));
n=rd(),m=rd(),T=rd();
d[0]=n;
for(int i=1;i<=m;++i) d[i]=rd();
d[m+1]=0;
for(int i=1;i<=n;++i) a[i]=a[i-1]+rd();
for(int i=0;i<=m;++i) c[i]=rd();
int nn=m;
m=-1;
for(int i=0;i<=nn;++i)
if(d[i]!=d[i+1]) d[++m]=d[i],c[m]=c[i];
d[m+1]=0;
for(int i=0;i<=m;++i)
for(int j=0;j<=m;++j)
{
if(i==j)
{
for(int k=m;k>i;--k)
bb.a[i][j]=(bb.a[i][j]+1ll*c[k]*(d[k]-d[k+1])%mod)%mod;
bb.a[i][j]=(bb.a[i][j]+1ll*c[i]*(d[i]-d[i+1]-d[i+1])%mod)%mod;
}
else bb.a[i][j]=1ll*c[min(i,j)]*(d[j]-d[j+1])%mod;
}
bb=bb^T;
for(int i=1;i<=n;++i)
{
int ll=2,rr=1,an=0;
for(int j=m;~j;--j)
{
int r=(i+d[j]-1)/d[j]*d[j],l=r-d[j]+1;
an=(an+((a[r]-a[l-1])-(a[rr]-a[ll-1]))%mod*bb.a[j][m]%mod)%mod;
ll=l,rr=r;
}
printf("%d",an);
if(i<n) putchar(' ');
}
if(K) puts("");
}
return 0;
}
hdu 6399 City Development的更多相关文章
- HDU 1505 City Game (hdu1506 dp二维加强版)
F - City Game Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submi ...
- HDU 3634 City Planning (离散化)
City Planning Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- hdu 3624 City Planning(暴力,也可扫描线)
City Planning Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- HDU 5013 City Tour
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5013 题意: 思路: 这里有错,是Hi(x)=sigama(Hji)(j属于x) const int ...
- HDU 1505 City Game(01矩阵 dp)
Problem Description Bob is a strategy game programming specialist. In his new city building game the ...
- HDU 之 City Game
City Game Time Lim ...
- HDU 1505 City Game(DP)
City Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- HDU 1505 City Game
这题是上一题的升级版 关键在于条形图的构造,逐行处理输入的矩阵,遇到'F'则在上一次的条形图基础上再加1,遇到'R'则置为0 然后用上一题的算法,求每行对应条形图的最大矩阵的面积. 另外:本来是deb ...
- HDU 1505 Largest Rectangle in a Histogram && HDU 1506 City Game(动态规划)
1506意甲冠军:给你一个连续的直方图(拼贴底部长度1).求连续基质区. 对每一个直方图,分别向左向右进行扩展. #include<cstdio> #include<stdlib.h ...
随机推荐
- word 之 插入删除空行
好久没有写程序了.有些手生: 在用C#对word进行直接开发操作过程中,为了文档的美观,我们会插入或删除空行. 1.插入空行的代码很简单. Selection 类型的TypeParagraph()函数 ...
- 如何使用Heartbeat,组建一个高可用性的mysql集群
转了好多次帖子,其实就是为了使用heartbeat来搭建mysql集群,网上很多都是用make来生成RPM来安装,我也找了很多资料,mysql 自带的cluster用户不满意,只能再次vmware虚拟 ...
- 查看HearthBuddy.exe文件是x86还是x64版本
https://www.cnblogs.com/chucklu/p/10020221.html 使用Powershell查看 PS C:\repository\GitHub\ChuckLu\Test\ ...
- leetcode-hard-array-11 Container With Most Water -NO
mycode time limited class Solution(object): def maxArea(self, height): """ :type hei ...
- Dropdown 下拉菜单
将动作或菜单折叠到下拉菜单中. 基础用法 移动到下拉菜单上,展开更多操作. 通过组件slot来设置下拉触发的元素以及需要通过具名slot为dropdown 来设置下拉菜单.默认情况下,下拉按钮只要ho ...
- pandas-赋值操作
1,pandas操作主要有对指定位置的赋值,如上一篇中的数据选择一样,根据loc,iloc,ix选择指定位置,直接赋值 2,插入,insert方法,插入行和列 3,添加 4,删除 drop方法 5,弹 ...
- class文件访问标志
class文件中用两个字节共16位代表访问标志(access flags),用于表明该类或接口被访问时能提供的一些信息: 标志名称 标志值 含义 ACC_PUBLIC 0x00 01 是否为Publi ...
- MybatisPlus使用代码篇
package spring.server.consumer; import com.baomidou.mybatisplus.annotation.DbType; import com.baomid ...
- C#编程 socket编程之udp服务器端和客户端
基于Udp协议是无连接模式通讯,占用资源少,响应速度快,延时低.至于可靠性,可通过应用层的控制来满足.(不可靠连接) 使用Udp协议通讯需要具备以下几个条件: (1).建立一个套接字(Socket) ...
- 【神经网络与深度学习】ZLIB介绍
zlib类库提供了很多种压缩和解压缩的方式,由于时间的关系我只学习一下内容,以下是我在实现web 服务器压缩数据网页中使用到一些函数和常用数据结构.常量等. zlib使用过程 压缩过程:deflate ...