HZOJ 20190727 随(倍增优化dp)
达哥T1
实际上还是挺难的,考试时只qj20pts,还qj失败
因为他专门给出了mod的范围,所以我们考虑把mod加入时间复杂度。
$50\%$算法:
考虑最暴力的dp,设$f[i][j]$表示进行$i$次操作后得到的数为$j$,方案总数,转移应该还是很明显的
$dp[i][j*k\%mod]=dp[i-1][j]×cnt[k]$,$cnt[k]$表示数k出现的次数。
然后在结合前20ptsqj,就可以愉快的拿到50pts。
$100\%$算法:
看题解发现什么原根,矩阵乘,蒟蒻弃疗....
但颓博客时发现remarkable大神写出了倍增优化dp,好像有救了。
根据50分算法,我们可以得到一个性质 $f[i*ii][j*k%mod]=f[i][j]*f[ii][k]$ 蒟蒻博主并不会证
那么$f[i^2][j*k\%mod]=f[i][j]*f[i][k]$ ,这样我们可以处理出$f[i]$,$f[i^2]$,$f[i^4]$,$f[i^8]$....
这样我们根据二进制拆分思想,可以求出ans。
其实这个过程类似于快速幂。
把快速幂模板中的变量换成数组即可。
最后使用滚动数组省空间。
之前没有做过倍增优化dp的题,这道题就当熟悉套路吧。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define int long long
const int P=;
const int M=;
using namespace std;
int n,m,mod,wi;
int now1=,now2=,last1,last2;
int cnt[M],f[][M],g[][M],a[];
int qpow(int a,int b,int p){
int ans=;
while(b){
if(b&) ans=ans*a%p;
b>>=;
a=a*a%p;
}
return ans%p;
}
void solve(int x){
while(x){
//cout<<x<<endl;
if(x&){
memset(g[now1],,sizeof(g[now1]));
for(int i=;i<mod;i++) for(int j=;j<mod;j++) g[now1][i*j%mod]=(g[now1][i*j%mod]+g[last1][j]*f[last2][i])%P;
now1=last1,last1^=;
}
x>>=;
memset(f[now2],,sizeof(f[now2]));
for(int i=;i<mod;i++) for(int j=;j<mod;j++) f[now2][i*j%mod]=(f[now2][i*j%mod]+f[last2][i]*f[last2][j])%P;
now2=last2,last2^=;
}
return ;
}
signed main(){
scanf("%lld%lld%lld",&n,&m,&mod);
for(int i=;i<=n;i++) {scanf("%lld",&a[i]);cnt[a[i]]++;}
for(int i=;i<mod;i++) f[][i]=cnt[i];
g[][]=;
solve(m);
int Griezmman=qpow(qpow(n,m,P),P-,P)%P,ans=;
//cout<<Griezmman<<endl;
for(int i=;i<mod;i++) ans=(ans+g[last1][i]*i)%P;
//cout<<ans<<endl;
ans=ans*Griezmman%P;
printf("%lld",ans);
}
HZOJ 20190727 随(倍增优化dp)的更多相关文章
- $Noip2012\ Luogu1081$ 开车旅行 倍增优化$ DP$
Luogu Description Sol 1.发现对于每个城市,小A和小B的选择是固定的,可以预处理出来,分别记为ga[],gb[] 2.并且,只要知道了出发城市和出发天数,那么当前城市和小A,小B ...
- CodeForces - 1175E Minimal Segment Cover (倍增优化dp)
题意:给你n条线段[l,r]以及m组询问,每组询问给出一组[l,r],问至少需要取多少个线段可以覆盖[l,r]区间中所有的点. 如果贪心地做的话,可以求出“从每个左端点l出发选一条线段可以到达的最右端 ...
- $CH0601\ Genius\ ACM$ 倍增优化DP
ACWing Description 给定一个长度为N的数列A以及一个整数T.我们要把A分成若干段,使得每一段的'校验值'都不超过N.求最少需要分成几段. Sol 首先是校验值的求法: 要使得'每对数 ...
- 0x57 倍增优化DP
真的是下定了巨大的决心来搞这一讲,果不其然耗了一晚上 开车旅行(真的是NOIP的题吗怎么这么恐怖) 首先,先用set把小A和小B从城市i出发,到达的下一个城市预处理出来. f[i][j][k]表示走了 ...
- POJ 1014 Dividing(多重背包, 倍增优化)
Q: 倍增优化后, 还是有重复的元素, 怎么办 A: 假定重复的元素比较少, 不用考虑 Description Marsha and Bill own a collection of marbles. ...
- Codeforces 356D 倍增优化背包
题目链接:http://codeforces.com/contest/356/problem/D 思路(官方题解):http://codeforces.com/blog/entry/9210 此题需要 ...
- 矩阵乘法优化DP复习
前言 最近做毒瘤做多了--联赛难度的东西也该复习复习了. Warning:本文较长,难度分界线在"中场休息"部分,如果只想看普及难度的可以从第五部分直接到注意事项qwq 文中用(比 ...
- bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)
题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...
- bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)
题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L ...
随机推荐
- Ruby Rails学习中:登陆
登陆 一. Sessions 控制器 登录和退出功能由 Sessions 控制器中相应的 REST 动作处理 : 登录表单在 new 动作中处理, 登录的过程是向 create 动作发送 POST 请 ...
- 基于keepalived搭建mysql双主高可用
目录 概述 环境准备 keepalived搭建 mysql搭建 mysql双主搭建 mysql双主高可用搭建 概述 传统(不借助中间件)的数据库主从搭建,如果主节点挂掉了,从节点只能读取无法写入,只能 ...
- ssh无密登录_集群分发脚本xsync
1.ssh免密登录 ssh ip地址 [root@192 ~]# ssh 192.168.1.102 root@192.168.1.102's password: Last login: Mon Fe ...
- O039、Unshelve Instance 操作详解
参考https://www.cnblogs.com/CloudMan6/p/5529915.html 上一节我们 shelve Instance 到 Glance,本节学习如何通过 unshelv ...
- vuex store更新了数据,但未触发getters
遇到一个奇怪的问题,我将数组存储在store中,更新数组,第一次会生效,第二次就不会再触发getters,通过检查发现state中的数组是有更新的. 尝试过网上很多的解决办法: 1.getters r ...
- Linux系统介绍及部署
Linux系统介绍及部署1.常见操作系统 windows.Linux(类unix系统).Android.iOS.unix(HP UNIX)2.操作系统构成 外壳(shell)+驱动+内核3.常见Lin ...
- kbmMW均衡负载与容灾(1)
kbmMW为均衡负载与容灾提供了很好的机制,支持多种实现方式,现在看看最简单的一种,客户端控制的容灾和简单的负载均衡. 现在,我们将kbmMWServer部署到不同的服务器,或者在同一服务器部署多份实 ...
- 基于Scrapt框架的全站数据爬取
创建scrapy工程项目,除了爬虫文件中的代码需要略微修改,其他模块用法相同(如中间件,管道等): 爬虫文件代码流程 导入链接提取器 from scrapy.linkextractors import ...
- vue项目中关于微信分享的坑,以及安卓和ios获取location.href不同的处理
最近做vue项目的微信公众号项目,涉及到微信分享,记录一下心得,以备后用,vue路由用的是hash模式: 该项目只是公众号里面的h5链接,不需要获取code获取access_token的票据,因此前端 ...
- SQL语句复习【专题二】
SQL语句复习[专题二] 单行函数(日期.数学.字符串.通用函数.转换函数)多行函数.分组函数.多行数据计算一个结果.一共5个.sum(),avg(),max(),min(),count()分组函数 ...