本题算是签到题,但由于赛中花费了过多的时间去滴吧格,造成了不必要的浪费以及智商掉线,所以有必要记录一下坑点

题意:方格从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

转载于:https://www.cnblogs.com/caturra/p/9654919.html

2018焦作网络赛 - Poor God Water 一道水题的教训相关推荐

  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 ...

  2. 2018宁夏网络赛 B Goldbach (米勒拉宾素数测试)

    2018宁夏网络赛 B Goldbach (米勒拉宾素数测试) 题目链接 题目大意: 给你一个偶数n (2<n<=1e18) 让你把n分解成两个素数的和.(如果有多个输出任意一个) 解题思 ...

  3. ACM-ICPC 2018 北京网络赛:K-Dimensional Foil II

    #1835 : K-Dimensional Foil II 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 "K-Dimensional Foil" i ...

  4. 2018年国赛高教杯数学建模A题高温作业专用服装设计解题全过程文档及程序

    2018年国赛高教杯数学建模 A题 高温作业专用服装设计 原题再现   在高温环境下工作时,人们需要穿着专用服装以避免灼伤.专用服装通常由三层织物材料构成,记为I.II.III层,其中I层与外界环境接 ...

  5. ACM网络赛金华赛区的一道关于树的题:Family Name List

    三场网络赛终于告一段落了!唉,实力太弱了!跟北大.清华这些家伙差距太远了,比"我在你身边你却不知道我爱你"的距离还要远! 这道题没有来得及提交,自己下来写完的,把样例过了!留在博客 ...

  6. hdu-5867 Water problem(水题)

    题目链接: Water problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  7. [2018 徐州 网络赛|Hard to prepare ] 环形染色问题的公式解法

    题目来源 After Incident, a feast is usually held in Hakurei Shrine. This time Reimu asked Kokoro to deli ...

  8. 2018 青岛网络赛C题Halting Problem

    判断一个指定的程序是一直运行下去还是会停止.停止好判断,就是如何判断是否会一直运行下去.当第二次到达第n步的时候,如果此时的r仍然是第一次到达第n步时候的r,那么这个程序会一直运行下去. 通过这道题还 ...

  9. 2018南京网络赛 G. Lpl and Energy-saving Lamps (线段树非递归实现)

    线段树非递归实现.点修改下的区间查询. 注意预处理的时候要把一到十万的都进行处理一遍,因为输入的月份不一定在月份的个数之内. #include <iostream> #include &l ...

最新文章

  1. undefined reference to...
  2. 若依前后端分离版(vue)中配置页面跳转的路由
  3. mysql查询子表的语句_MySQL基本SQL语句之单表查询、多表查询和子查询
  4. 剑英的区块链学习手记(一)
  5. matlab reshape矩阵维度变换
  6. django系列3.3--CBV 和 FBV
  7. php系列框架的加速器Opcache
  8. python入门之运算符的使用第一关_python基础教程之python 学习第四天|python基础教程|python入门|python教程...
  9. 数字信号处理笔记02:离散时间傅里叶变换(DTFT)
  10. Autumn中文文档3:接收客户端数据
  11. [Irving]Sql Server 日期、时间、比较
  12. 阿里云七天训练营学习(4):服务器管理软件(putty、ccaa)
  13. 课设系列:51单片机制作智能时钟闹钟
  14. 2020暑期实习 总结
  15. 对“出轨情人节”的看法
  16. web前端大作业--黑色电影资讯博客网页设计(电影主题-HTML+CSS+JavaScript)
  17. EL表达式中fn函数的强大功能,很简单,很好用,很强大
  18. 安装lamp服务器系统,LAMP安装环境搭建详解
  19. linux发广告软件下载,ADPower广告管理系统(Linux手动安装)
  20. zzuli:1102火车票退票费计算(函数专题)

热门文章

  1. Android程序开发0基础教程(一)
  2. javascript常用技巧归纳
  3. CAutoupdater通用 自动升级组件用户手册
  4. 技术管理中的“沟通”
  5. http://www.cnoug.org/viewthread.php?tid=9292
  6. Python import导入模块与函数方法 Python语言基础【1】
  7. Android ContextCompat 使用详解
  8. Mybatis if标签和where标签结合巧妙使用
  9. header.vue 调用变量,别的组件导入引用,组件方法事例实例
  10. 日期和毫秒值 例子