题目传送门:https://agc013.contest.atcoder.jp/tasks/agc013_e

题目大意:

给定一个长度为\(n\)的木板,木板上有\(m\)个标记点,距离木板左端点的距离分别为\(X_i\),现在你需要在木板上放置一些不相交正方形,正方形需要满足

  • 正方形的边长为整数
  • 正方形底面需要紧贴木板
  • 正方形不能超出木板,正方形要将所有的木板覆盖
  • 标记点的位置不能是两个正方形的交界处

一种合法的正方形放置方案的贡献为所有正方形面积的乘积,也就是为\(\prod\limits_{i=1}^k a_i^2\),\(a_i\)为正方形的边长

请你求出所有合法方案的贡献之和,答案对\(10^9+7\)取模


这题主要难在如何转化题意,假定我们已经得到了一个合法的正方形放置方案,该如何求贡献?我们可以在正方形内放置两个标记,标记是无序的,且标记可以重叠,那么所有合法的标记摆放方案即为贡献

按照这个思路,我们可以设\(f[x][k]\)表示现在处理到第\(x\)个位置,第\(x\)个位置所在的正方形内有\(k\)个标记,这样复杂度是\(O(N)\)的,我们可以用矩乘优化到\(O(M\log N)\)

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline char gc(){
static char buf[1000000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int frd(){
int x=0,f=1; char ch=gc();
for (;ch<'0'||ch>'9';ch=gc()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=gc()) x=(x<<3)+(x<<1)+ch-'0';
return x*f;
}
inline int read(){
int x=0,f=1; char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
return x*f;
}
inline void print(int x){
if (x<0) putchar('-'),x=-x;
if (x>9) print(x/10);
putchar(x%10+'0');
}
const int N=1e5,p=1e9+7;
const int A[3][3]={
{1,2,1},
{0,1,1},
{1,2,2},
};
const int B[3][3]={
{1,2,1},
{0,1,1},
{0,0,1},
};
struct Matrix{
int v[3][3];
Matrix(){memset(v,0,sizeof(v));}
void clear(){memset(v,0,sizeof(v));}
void init(){for (int i=0;i<3;i++) v[i][i]=1;}
}trans,Ans,T;
Matrix operator *(const Matrix &x,const Matrix &y){
Matrix z;
for (int i=0;i<3;i++)
for (int j=0;j<3;j++)
for (int k=0;k<3;k++)
z.v[i][k]=(z.v[i][k]+1ll*x.v[i][j]*y.v[j][k])%p;
return z;
}
Matrix mlt(Matrix a,int b){
Matrix res; res.init();
for (;b;b>>=1,a=a*a) if (b&1) res=res*a;
return res;
}
int val[N+10];
int main(){
int n=read(),m=read(),Last=0;
memcpy(T.v,B,sizeof(B));
memcpy(trans.v,A,sizeof(A));
Ans.v[0][0]=1;
Ans=Ans*trans,Last=1;
for (int i=1;i<=m;i++){
int x=read();
Ans=Ans*mlt(trans,x-Last);
Ans=Ans*T,Last=x+1;
}
Ans=Ans*mlt(trans,n-Last);
printf("%d\n",Ans.v[0][2]);
return 0;
}

AtCoder Grand Contest 013 E - Placing Squares的更多相关文章

  1. Atcoder Grand Contest 013 E - Placing Squares(组合意义转化+矩阵快速幂/代数推导,思维题)

    Atcoder 题面传送门 & 洛谷题面传送门 这是一道难度 Cu 的 AGC E,碰到这种思维题我只能说:not for me,thx 然鹅似乎 ycx 把题看错了? 首先这个平方与乘法比较 ...

  2. AtCoder Grand Contest 013 C:Ants on a Circle

    题目传送门:https://agc013.contest.atcoder.jp/tasks/agc013_c 题目翻译 给你一个周长为\(L\)的圆,有\(N\)只蚂蚁在圆上爬,速度为一单位距离每秒. ...

  3. AtCoder Grand Contest 013

    这场打得蛮菜的,很晚才出BC,还一堆罚时…… A - Sorted Arrays 题目大意:将给定数列划分成单调不增或单调不减的区间,求最少区间数. 贪心即可. #include<cstdio& ...

  4. AtCoder Grand Contest 013 C :Ants on a Circle

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  5. AtCoder Grand Contest 013题解

    传送门 \(A\) 先把相同的缩一起,然后贪心就可以了 //quming #include<bits/stdc++.h> #define R register #define fp(i,a ...

  6. 【agc013d】AtCoder Grand Contest 013 D - Piling Up

    题意 盒子里有n块砖,每块的颜色可能为蓝色或红色. 执行m次三步操作: 1.从盒子里随便拿走一块砖 2.放入一块蓝砖和红砖到盒子里 3.从盒子里随便拿走一块砖 给定n,m 问拿出来的砖,可能有多少种不 ...

  7. AtCoder Grand Contest 012

    AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...

  8. AtCoder Grand Contest 011

    AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...

  9. AtCoder Grand Contest 031 简要题解

    AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...

随机推荐

  1. tomcat重启报错

    一.tomcat重启报java环境变量错 报错信息详细如下: Neither the JAVA_HOME nor the JRE_HOME environment variable is define ...

  2. YTUOJ-推断字符串是否为回文

    题目描写叙述 编敲代码,推断输入的一个字符串是否为回文.若是则输出"Yes",否则输出"No".所谓回文是指順读和倒读都是一样的字符串. 输入 输出 例子输入 ...

  3. 6.游戏特别离不开脚本(4)-应该避免将集合框架对象传给JS

    java map  传给 javascript 不是自动关联的,最好别传啊,遍历起来也麻烦(尽量避开集合框架吧),用数组或者自建一个对象.这里虽然有种方法: // build a Map Map< ...

  4. ivy

    ivy https://ant.apache.org/ivy/ Apache Ivy™ is a popular dependency manager focusing on flexibility ...

  5. ossfs常见配置错误

    以下问题出现在非root用户下 执行echo ××××> /etc/passwd-ossfs  bash: /etc/passwd-ossfs: Permission denied 使用sudo ...

  6. xalion三层与Web开发帖子一览表 good

    使用http.sys,让delphi 的多层服务飞起来(Delphi借用http.sys充当http服务器,也就可以发送返回JSON等信息,当然浏览器也可以使用)http://www.cnblogs. ...

  7. hadoop2.x安装配置

    1.首先准备hadoop2.2.0的安装包,从官网获取,略. 2.加压安装包,进行配置.假设hadoop安装到/usr/hadoop-2.2.0目录,则进行如下配置: (1)/etc/profile配 ...

  8. sublime text 3 安装vue 语法插件

    1.下载https://github.com/vuejs/vue-syntax-highlight,点击这里也可以下载压缩包 2.解压到C:\Users\***\AppData\Roaming\Sub ...

  9. 【BZOJ 2818】 GCD

    [题目链接] 点击打开链接 [算法] 线性筛出不大于N的所有素数,枚举gcd(x,y)(设为p),问题转化为求(x,y)=p的个数          设x=x'p, y=y'p,那么有(x,y)=1且 ...

  10. 区间DP 等腰三角形

    题目描述:给定一个正N边形,可以通过连线将这个多边形分割成N-2个三角形,问这N-2个三角形中恰有k个等腰三角形的分割方法有多少?这个值可能很大,输出对9397取模的结果.数据范围:n,k <= ...