2018焦作网络赛 - Poor God Water 一道水题的教训
本题算是签到题,但由于赛中花费了过多的时间去滴吧格,造成了不必要的浪费以及智商掉线,所以有必要记录一下坑点
题意:方格从1到n,每一格mjl可以选择吃鱼/巧克力/鸡腿,求走到n格时满足
1.每三格不可重复同一种食物
2.每三格均不同食物时中间格子不可吃巧克力
3.每三格前后两格不可同时吃巧克力
以上三个条件的方案数,n<1e10
太长不看版:打表+快速幂AC
长篇吐槽版
很显然的,设\(dp[n][i][j][k]\),走到第\(n\)格时第\(n-2\)格的食物是\(i\),第\(n-1\)的食物是\(j\),第\(n\)的食物是\(k\)的方案数
然后一波转移套上矩阵快速幂,应该没问题?
那么首先应该搞出所有转移,emmm好像方程很多,手写花了一定时间发现写歪了(傻逼做法1
于是写了个程序暴力转移
rep(i,1,3)rep(j,1,3)rep(k,1,3){
printf("dp[i][%d][%d][%d]=",i,j,k);
bool flag=0;
if(i==j&&j==k&&i==k) flag=1;
if(j==2&&i!=2&&k!=2&&i!=k) flag=1;
if(i==2&&k==2) flag=1;
if(flag){
cout<<0<<endl;
continue;
}
flag=0;
int jj=i,kk=j;
rep(ii,1,3){
if(ii==jj&&jj==kk&&ii==kk)continue;
if(jj==2&&ii!=2&&kk!=2&&ii!=kk)continue;
if(ii==2&&kk==2)continue;
printf("dp[i-1][%d][%d][%d]+",ii,jj,kk);
flag=1;
}
cout<<endl;
}
于是得到
dp[i][1][1][1]=0
dp[i][1][1][2]=dp[i-1][2][1][1]+dp[i-1][3][1][1];
dp[i][1][1][3]=dp[i-1][2][1][1]+dp[i-1][3][1][1];
dp[i][1][2][1]=dp[i-1][1][1][2]+dp[i-1][3][1][2];
dp[i][1][2][2]=dp[i-1][1][1][2]+dp[i-1][3][1][2];
dp[i][1][2][3]=0;
dp[i][1][3][1]=dp[i-1][1][1][3]+dp[i-1][2][1][3]+dp[i-1][3][1][3];
dp[i][1][3][2]=dp[i-1][1][1][3]+dp[i-1][2][1][3]+dp[i-1][3][1][3];
dp[i][1][3][3]=dp[i-1][1][1][3]+dp[i-1][2][1][3]+dp[i-1][3][1][3];
dp[i][2][1][1]=dp[i-1][1][2][1]+dp[i-1][2][2][1];
dp[i][2][1][2]=0;
dp[i][2][1][3]=dp[i-1][1][2][1]+dp[i-1][2][2][1];
dp[i][2][2][1]=dp[i-1][1][2][2]+dp[i-1][3][2][2];
dp[i][2][2][2]=0;
dp[i][2][2][3]=dp[i-1][1][2][2]+dp[i-1][3][2][2];
dp[i][2][3][1]=dp[i-1][2][2][3]+dp[i-1][3][2][3];
dp[i][2][3][2]=0;
dp[i][2][3][3]=dp[i-1][2][2][3]+dp[i-1][3][2][3];
dp[i][3][1][1]=dp[i-1][1][3][1]+dp[i-1][2][3][1]+dp[i-1][3][3][1];
dp[i][3][1][2]=dp[i-1][1][3][1]+dp[i-1][2][3][1]+dp[i-1][3][3][1];
dp[i][3][1][3]=dp[i-1][1][3][1]+dp[i-1][2][3][1]+dp[i-1][3][3][1];
dp[i][3][2][1]=0;
dp[i][3][2][2]=dp[i-1][1][3][2]+dp[i-1][3][3][2];
dp[i][3][2][3]=dp[i-1][1][3][2]+dp[i-1][3][3][2];
dp[i][3][3][1]=dp[i-1][1][3][3]+dp[i-1][2][3][3];
dp[i][3][3][2]=dp[i-1][1][3][3]+dp[i-1][2][3][3];
dp[i][3][3][3]=0;
先试试样例,卧槽怎么全是0的
发现忘了前3项特判初始化(傻逼做法2
赶紧加上去
rep(i,1,3)dp[1][0][0][i]=dp[0][0][0][0];
rep(i,1,3)rep(j,1,3)dp[2][0][i][j]+=dp[1][0][0][i];
rep(i,1,3)rep(j,1,3)rep(k,1,3){
if(i==j&&j==k&&i==k)continue;
if(j==2&&i!=2&&k!=2&&i!=k)continue;
if(i==2&&k==2)continue;
dp[3][i][j][k]+=dp[2][0][i][j];
}
搞完后怒上27*27的矩阵,然而TLE(傻逼做法3
再套了个费马小定理,TLE(hhh
dalao指点了不如试试BM?没办法只好上了
得到f[n]=2f[n-1]-f[n-2]+3f[n-3]+2f[n-4]
再怒上一波快速幂,发现答案歪了..挂机10min
最后偶然发现必须后几项开始推才是正确的(傻逼做法4
推完后改代码发现又递推不上去了,两个人同时写都歪了
再次发现递推矩阵的上三角写歪了一位...(傻逼做法5
对了,挪板子的时候发现MOD写成了1e9+9,幸好被队友发现了hhh(傻逼做法6
最后奉上代码
#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define rrep(i,j,k) for(int i=j;i>=k;i--)
#define println(a) printf("%lld\n",(ll)(a))
#define printbk(a) printf("%lld ",(ll)(a))
using namespace std;
typedef long long ll;
const int maxn = 100;
const int MAXN = maxn;
const ll MOD = 1e9+7;
inline ll mod(ll a){return a%MOD;}
ll read(){
ll x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
ll b[5][5]={
{0,0,0,0,0},
{0,2,-1,3,2},
{0,1,0,0,0},
{0,0,1,0,0},
{0,0,0,1,0},
};
ll c[]={0,2956,1286,560,244};
struct Mat{
ll m[5][5],r,c;
void node(int rr,int cc,bool unit=0){
r=rr;c=cc;
memset(m,0,sizeof m);
if(unit) rep(i,1,4) m[i][i]=1;
}
void print(){
rep(i,1,4){
rep(j,1,4){
cout<<m[i][j]<<" ";
}
cout<<endl;
}
}
};
Mat operator * (Mat a,Mat b){
Mat ans;ans.node(a.r,b.c);
rep(i,1,4){
rep(j,1,4){
int t=4;
rep(k,1,t){
ans.m[i][j]+=mod(a.m[i][k]*b.m[k][j]);
ans.m[i][j]=mod(ans.m[i][j]);
}
}
}
return ans;
}
Mat qmod(Mat a,ll n){
Mat ans;ans.node(4,4,1);
while(n){
if(n&1) ans=ans*a;
n>>=1;
a=a*a;
}
return ans;
}
ll ans[]={0,3,9,20,46,106,244,560,1286,2956};
int main(){
int T=read();
while(T--){
Mat base,base2;
base.node(4,4); base2.node(4,4);
rep(i,1,4) rep(j,1,4) base.m[i][j]=b[i][j];
rep(i,1,4) base2.m[i][1]=c[i];
ll n=read();
if(n<=9){
println(ans[n]);
continue;
}
base=qmod(base,n-9);
Mat res=base*base2;
println((res.m[1][1]+MOD)%MOD);
}
return 0;
}
感觉这回比赛得背锅啊orz
2018焦作网络赛 - Poor God Water 一道水题的教训的更多相关文章
- 焦作网络赛L-Poor God Water【矩阵快速幂】
God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells him t ...
- ACM-ICPC 2018 焦作网络赛
题目顺序:A F G H I K L 做题链接 A. Magic Mirror 题意:判断 给出的 字符串 是否等于"jessie",需要判断大小写 题解:1.用stl库 tolo ...
- 2018 焦作网络赛 L Poor God Water ( AC自动机构造矩阵、BM求线性递推、手动构造矩阵、矩阵快速幂 )
题目链接 题意 : 实际上可以转化一下题意 要求求出用三个不同元素的字符集例如 { 'A' .'B' .'C' } 构造出长度为 n 且不包含 AAA.BBB CCC.ACB BCA.CAC CBC ...
- 2018焦作网络赛Mathematical Curse
题意:开始有个数k,有个数组和几个运算符.遍历数组的过程中花费一个运算符和数组当前元素运算.运算符必须按顺序花费,并且最后要花费完.问得到最大结果. 用maxv[x][y]记录到第x个元素,用完了第y ...
- 2018焦作网络赛Give Candies
一开始忽略了欧拉定理指数部分是modphi(n-1)没有memset,减法后面没加0:
- 2018 焦作网络赛 K Transport Ship ( 二进制优化 01 背包 )
题目链接 题意 : 给出若干个物品的数量和单个的重量.问你能不能刚好组成总重 S 分析 : 由于物品过多.想到二进制优化 其实这篇博客就是存个二进制优化的写法 关于二进制优化的详情.百度一下有更多资料 ...
- 2018 焦作网络赛 G Give Candies ( 欧拉降幂 )
题目链接 题意 : 给出 N 个糖果.老师按顺序给 1~N 编号的学生分配糖果.每个学生要么不分.要么最少分一个.且由于是按顺序发放.那么对于某个有分到糖果的编号为 i 的学生.则 1~(i-1) 这 ...
- 2018焦作网络赛-E- Jiu Yuan Wants to Eat
题目描述 You ye Jiu yuan is the daughter of the Great GOD Emancipator. And when she becomes an adult, s ...
- 2018 CCPC网络赛
2018 CCPC网络赛 Buy and Resell 题目描述:有一种物品,在\(n\)个地点的价格为\(a_i\),现在一次经过这\(n\)个地点,在每个地点可以买一个这样的物品,也可以卖出一个物 ...
随机推荐
- 为什么都说UX / UI设计师是最佳工作?
以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 你将成为永远热爱自己工作的人,做着自己喜欢的工作还能得到相应的成果和报酬,就好似在度带薪年假一般,何 ...
- Spring boot——logback.xml 配置详解(二)
阅读目录 1 根节点包含的属性 2 根节点的子节点 文章转载自:http://aub.iteye.com/blog/1101260,在此对作者的辛苦表示感谢! 回到顶部 1 根节点<config ...
- 从cookie中取值$.cookie()
从cookie中取值: var userid = $.cookie("remoteuserid");例子: function delUser() { var table = ...
- SLAM应用的一些思考
关心SLAM技术的人有两种.一是像我这样的研究者,为了了解其中各种方法和模块的原理.二是机器人技术的开发者,旨在将SLAM技术用到他们自己的机器人上.从数量上来说,第二类人数远多于第一类,他们的需求也 ...
- CentOS 最新版的下载地址 + 版本选择详解
CentOS 最新版的下载地址 + 版本选择详解 发现越来越多的机关单位.事业单位开始使用 Linux 作为主要服务器,毕竟,Linux的稳定性和高效性是众所周知的,所以我也打算把自己这一块技术加强一 ...
- Python + selenium + unittest装饰器 @classmethod
前言 前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间. 于是就想是不是可以 ...
- 在ASP.NET Core2上操作MongoDB就是能这么的简便酷爽(自动完成分库分表)
NoSQL是泛指非关系型的数据库,现今在我们的项目中也多有使用,其独特的优点为我们的项目架构带来了不少亮点,而我们这里的主角(MongoDB)则是NoSQL数据库家族中的一种.事实上,NoSQL数据库 ...
- CDI Event解析
CDI(Contexts And Dependency Injection)是JavaEE 6标准中一个规范,将依赖注入IOC/DI上升到容器级别, 它提供了Java EE平台上服务注入的组件管理核心 ...
- Linq使用中的ToList注意事项
在使用Linq时,如果查询逻辑太复杂,可以拆分为多个Linq查询,下一个Linq在上一个Linq查询的结果上继续操作,这样逻辑清晰,又不会出错.但在使用ToList的时候需要注意,最常见碰到的错误是: ...
- docker怎么导出导入镜像
https://blog.csdn.net/dest_dest/article/details/80612231 把某个docker镜像保存到本地文件,命令如下docker save -o 镜像名.t ...