NOIp2018集训test-9-5(pm)
老张说:这套题太简单啦,你们最多两个小时就可以AK啦!
题 1 数数
我看到T1就懵了,这就是老张两个小时可以AK的题的T1??
然后我成功地T1写了1h+,后面1h打了t2.t3暴力,就很开心。
等差数列中的一个数B+A*N,发现A非常小,让人浮想联翩,把这个等差数列中每个数模A,得到的结果就是B%A而且很小,就可以数位dp。f[i][j][0/1]表示长度为i的二进制数,模A等于j,前i位有没有达到上界的方案数,g[i][j][0/1]表示这种情况下的答案。转移什么的看代码吧,就是基础的数位dp。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
typedef long long LL;
typedef double db;
using namespace std;
int T,A,lim[],n;
LL B,N,f[][][],g[][][],pr[],ans; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} LL find(LL up) {
if(!up) return ;
memset(f,,sizeof(f));
memset(g,,sizeof(g));
Rep(i,,) if(up&(1LL<<i)) { n=i; break; }
For(i,,n) lim[n-i]=(up&pr[i])?:;
f[][][]=;
For(i,,n) {
For(j,,A-) if(f[i][j][]||f[i][j][]) {
f[i+][(j*+)%A][]+=f[i][j][];
g[i+][(j*+)%A][]+=g[i][j][]+f[i][j][];
f[i+][j*%A][]+=f[i][j][];
g[i+][j*%A][]+=g[i][j][];
if(lim[i]==) {
f[i+][j*%A][]+=f[i][j][];
g[i+][j*%A][]+=g[i][j][];
}
else {
f[i+][j*%A][]+=f[i][j][];
g[i+][j*%A][]+=g[i][j][];
f[i+][(j*+)%A][]+=f[i][j][];
g[i+][(j*+)%A][]+=g[i][j][]+f[i][j][];
}
}
}
return g[n+][B%A][]+g[n+][B%A][];
} #define ANS
int main() {
#ifdef ANS
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
#endif
read(T);
pr[]=;
For(i,,) pr[i]=(pr[i-]<<);
while(T--) {
read(A); read(B); read(N);
LL ans=find(B+A*N)-find(max(0LL,B+A-));
printf("%lld\n",ans);
}
Formylove;
}
/*
2
10000 5641654165416 100077775545
9980 14244264416 10420477545
*/
题 2 旅游
考试的时候写了个暴力,只有20分,结果发现把题读错了,a,b都为0的点才不能经过,改过后就直接A了??数据大概是用脚造的
暴力就是把a离散,显然答案就是每种a中选一个点的序列。暴力枚举每种a的每一个点和它的前一种a中的每一个点转移。
正解我还没看懂,但是二维树状数组那个大概明白了,就是把绝对值拆开,按几种正负分别建树状数组,按a排序后,把a小的一部分加入树状数组,转移都会是一段区间,可以直接查询。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=;
typedef long long LL;
typedef double db;
using namespace std;
int n,m,a[N][N],b[N][N],ls[N*N],sz;
LL f[N][N],ans; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct node {
int x,y;
node(){}
node(int x,int y):x(x),y(y){}
}p[N*N];
vector<node>vc[N*N]; LL dis(node A,node B) { return abs(A.x-B.x)+abs(A.y-B.y);} #define ANS
int main() {
#ifdef ANS
freopen("tour.in","r",stdin);
freopen("tour.out","w",stdout);
#endif
read(n); read(m);
For(i,,n) For(j,,m) read(a[i][j]),ls[++ls[]]=a[i][j];
For(i,,n) For(j,,m) read(b[i][j]);
sort(ls+,ls+ls[]+);
sz=unique(ls+,ls+ls[]+)-(ls+);
For(i,,n) For(j,,m) {
if(b[i][j]==&&a[i][j]==) continue;
a[i][j]=lower_bound(ls+,ls+sz+,a[i][j])-ls;
vc[a[i][j]].push_back(node(i,j));
f[i][j]=b[i][j];
vc[a[i][j]].push_back(node(i,j));
}
For(i,,sz) {
int up1=vc[i].size(),up2=vc[i-].size();
For(j,,up1-) For(k,,up2-) {
node t1=vc[i][j],t2=vc[i-][k];
f[t1.x][t1.y]=max(f[t1.x][t1.y],f[t2.x][t2.y]+dis(t1,t2)+b[t1.x][t1.y]);
ans=max(ans,f[t1.x][t1.y]);
}
}
printf("%lld\n",ans);
Formylove;
}
题 3 做梦
注意读题,每次散步总时间不能超过m,就是每次离开起点到回到起点的时间间隔不超过m。
最后只有半个小时有点方,然后脑子就很乱,都知道是dp然后矩阵优化就是没搞对,dp还瞎弄了个两维的,只得了暴力分。
预处理每一次散步的方案,定义f[i][j][k]表示从i点走k步走到j点的方案数(点从1到m),可以用floyd求出。
然后每次散步走了x步,方案数就是f[1][1][x-2]*2(第一步从0走到1或-1,再不经过0地走x-2步走回1或-1,最后一步走回0)
g[i]表示散步总步数为i的方案数,也就是n==i的答案。
$g[n]=\sum_{i=2}^{m} g[n-i]*2*f[1][1][i-2]$
这是个线性递推,矩阵加速即可。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=,p=;
typedef long long LL;
typedef double db;
using namespace std;
int n,m;
LL f[N][N][N],g[N],ans; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct jz {
LL a[N][N];
friend jz operator *(const jz&A,const jz&B) {
jz rs;
For(i,,m) For(j,,m) {
rs.a[i][j]=;
For(k,,m)
(rs.a[i][j]+=A.a[i][k]*B.a[k][j]%p)%=p;
}
return rs;
}
}bs,rs; void ksm(int b) {
while(b) {
if(b&) rs=rs*bs;
bs=bs*bs;
b>>=;
}
} #define ANS
int main() {
#ifdef ANS
freopen("dream.in","r",stdin);
freopen("dream.out","w",stdout);
#endif
read(n); read(m);
For(i,,m) f[i][i-][]=,f[i][i+][]=,f[i][i][]=;
For(k,,m) For(i,,m) For(j,,m) {
if(j->=) f[i][j][k]=f[i][j-][k-];
if(j+<=*m+) (f[i][j][k]+=f[i][j+][k-])%=p;
}
g[]=;
For(s,,m) For(j,,m) if(s>=j)
g[s]=(g[s]+g[s-j]*2LL*f[][][j-]%p)%p;
For(i,,m) For(j,,m) {
if(i==j) rs.a[i][j]=;
else rs.a[i][j]=;
bs.a[i][j]=;
}
For(i,,m) bs.a[m-i+][m]=*f[][][i-];
For(i,,m-) bs.a[i+][i]=;
ksm(n-);
For(i,,m)
ans=(ans+rs.a[i][]*g[i]%p)%p;
printf("%lld\n",ans);
Formylove;
}
NOIp2018集训test-9-5(pm)的更多相关文章
- NOIp2018集训test-10-24(am&pm)
李巨连续AK三场了,我跟南瓜打赌李巨连续AK七场,南瓜赌李巨连续AK五场. DAY1 T1 qu 按题意拿stack,queue和priority_que模拟即可.特判没有元素却要取出的情况. T2 ...
- NOIp2018集训test-9-21(am/pm)
Am DAY1 抄代码 送分题 //Achen #include<bits/stdc++.h> #define For(i,a,b) for(int i=(a);i<=(b);i++ ...
- NOIp2018集训test-9-19(am&pm)
AM 这是一套在长沙考过而且我能记得全部正解的题,然后期望得分300实际得分155. T1 很套路,随便搞(我当年是怎么花大半场时间写T1并且写出现在两倍长的代码的??) //Achen #inclu ...
- NOIp2018集训test-9-22(am/pm) (联考三day1/day2)
szzq学长出的题,先orz一下. day1 倾斜的线 做过差不多的题,写在我自己的博客里,我却忘得一干二净,反而李巨记得清清楚楚我写了的. 题目就是要最小化这个东西 $|\frac{y_i-y_j} ...
- NOIp2018集训test-9-17(pm)
T1记忆(memory) 我大概是只记忆只有七秒的金鱼吧.看了下以前的代码发现真的很简单,但是考场上只打了个暴力,虽然骗了88pt.就是枚举选的是哪个串,然后vis[i]表示选了i这些位能不能猜出它, ...
- NOIp2018集训test-9-8(pm) (联考一day2)
把T1题读错了,想了一个多小时发现不可做.然后打了t2,常数不优秀.然后去打t3,lct,结果打挂爆0了. 然后今天就爆炸了. 如果这是noip我今年就可以直接回去学常规了.学常规多好,多开心. 今天 ...
- NOIp2018集训test-9-7(pm) (联考一day1)
又被辉神吊打了.今天不仅被辉神李巨吊打,还给基本上给全班垫底了. 看到T3就知道是十进制快速幂,全机房考试的当时应该就我会,结果我tm没找到递推. Orz lyc BM直接水过,Orz wys六个fo ...
- NOIp2018集训test-9-6(pm)
T1T2是洛谷原题.Orz辉神290,被辉神吊起来打. 题 1 包裹快递 二分答案.这题似乎卡精度,不开long double二分500次都过不去. //Achen #include<algor ...
- NOIp2018集训test-9-2(pm)
其实这套题我爆0了,T1define 写成ddefine编译错误 T2有两个变量爆int 但是我看zwh不在悄悄地改了,我心里还是十分愧疚(没有)的.主要是林巨已经虐我125了要是再虐我200分我大概 ...
随机推荐
- DELPHI 多线程(TThread类的实现)
之前学习了用API实现,让我们再学习下用DELPHI的TThread类. 先新建一个普通的工程,再新建一个线程类File>>New>>Othre>>Delphi F ...
- 关于C#的随机数
一直都知道random随机数可能出现相同的情况,但是一直没具体看为什么,网上一看又是一大堆例子给你出来,一点也不清晰,今天看msdn记录一下,msdn是讲的真的清楚. 实例化随机数生成器 通过向Ran ...
- JavaScript事件绑定的常见方式
在Javascript中,事件绑定一共有3种方式: ① 行内绑定 ② 动态绑定 ③ 事件监听 原文: https://mbd.baidu.com/newspage/data/landingsuper? ...
- 【转】SpringMVC整合websocket实现消息推送及触发
1.创建websocket握手协议的后台 (1)HandShake的实现类 /** *Project Name: price *File Name: HandShake.java *Packag ...
- IntelliJ IDEA下载地址
http://www.jetbrains.org/display/IJOS/Download
- v-on 绑定单个或多个事件
<div id="app07"> <!-- v-on:click 鼠标点击事件--> <a v-on:click="DoSomething& ...
- 8、iota枚举
1.iota常量自动生成器,每一行,自动累加1 2.iota给常量赋值使用 3.如果iota遇到const,就会重置为0 4.可以可以只写一个iota 5.如果是同一行,值是一样的 // 09_iot ...
- 高级运维(五):构建memcached服务、LNMP+memcached、使用Tomcat设置Session、Tomcat实现session共享
一.构建memcached服务 目标: 本案例要求先快速搭建好一台memcached服务器,并对memcached进行简单的添.删.改.查操作: 1> 安装memcached软件,并启动服务d ...
- zip mysql安装启动方式
首先在官网(https://dev.mysql.com/downloads/mysql/)下载相应的zip包 然后进行解压找到配置文件 my-default.ini 文件打开进行配置 主要配置以下几项 ...
- mac 安装brew mac安装expect mac一键登录服务器脚本
mac 安装brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ma ...