Diamond-square 算法是一种能够用于生成噪声的算法,现在我们考虑这个算法的一个变种。

你有一个 2^n\times 2^n2​n​​×2​n​​ 的网格,一共有 (2^n+1)^2(2​n​​+1)​2​​个格点,现在给定四个角的初始权值以及一个值 xx。

整个算法由若干个 diamond step 和 square setp 交替进行来构成。

在一个 diamond step 或者 square step 中,会有若干个之前没有被赋值的点被赋值,其值等于之前的某四个或三个点的值的和加上 xx。

xx 的值每进行完一次 diamond step 和一次 square step 之后就会变成原来的二倍。

而具体的过程用图来描述如下,在样例解释中可以看到更详细的文字解释:

现在我们想知道整个矩阵最后的值的和模 10^9+710​9​​+7 等于多少。

输入格式

一行 66 个整数,分别代表 nn,左上角权值,右上角权值,左下角权值,右下角权值,xx 的初始值。

保证初始权值和 xx 都在 [0,10^9+7)[0,10​9​​+7)之内。

输出格式

一行一个整数,代表矩阵内所有元素的和模 10^9+710​9​​+7 的值。

数据规模

样例解释

最终矩阵如下:

 
 
 
 
 
1
0    446   112   590   24    590   112   446   0
2
456  326   976   446   1142  446   976   326   456
3
122  1046  84    1346  218   1346  84    1046  122
4
670  506   1446  590   1428  590   1446  506   670
5
34   1382  258   1578  22    1578  258   1382  34
6
780  576   1656  700   1728  700   1656  576   780
7
162  1326  114   1756  298   1756  114   1326  162
8
646  466   1396  636   1622  636   1396  466   646
9
10   656   172   860   44    860   172   656   10
 
 

如题面图,四个角赋为初始值,随后开始执行算法:

Diamond step:中点被赋值为四个角的和 +x+x。

Square step:四条边的中点被赋值为所在边的两个端点与中点的和 +x+x。

xx 变为原来的两倍。

Diamond step:把整个矩阵分成四个等大小的正方形,这四个正方形的中点被分别赋值为正方形的四角的和 +x+x。

Square step:把整个矩阵分成四个大小相等的正方形,对于每个正方形的每一条边的中点,把他赋值为其向上下左右四个方向找到的第一个已经被赋值的点的和 +x+x(对于整个矩形的边界上的点,会有一个方向不存在,那么这个点被赋值为另外三个方向的和 +x+x)。

xx 变为原来的两倍。

所有点都被赋值,算法结束。

忽略每行输出的末尾多余空格

样例输入

3 0 0 10 10 2

样例输出

55178
不多BB,直接模拟就行了O(4n)
要注意尽可能少枚举多余的状态,如果变成了O(n*4n)就会超时
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long lol;
lol Mod=;
lol pw[],a[][],d,n,ans;
int main()
{int i,j,flag,k;
cin>>n;
pw[]=;
for (i=;i<=n;i++)
pw[i]=pw[i-]*;
cin>>a[][]>>a[][pw[n]]>>a[pw[n]][]>>a[pw[n]][pw[n]]>>d;
for (i=n;i>=;i--,(d*=)%=Mod)
{
for (j=;j<pw[n];j+=pw[i])
{
for (k=;k<pw[n];k+=pw[i])
{
int x=j+pw[i-],y=k+pw[i-];
a[x][y]=a[j][k]+a[j+pw[i]][k]+a[j][k+pw[i]]+a[j+pw[i]][k+pw[i]]+d;
a[x][y]%=Mod;
}
}
flag=;
for (j=;j<=pw[n];j+=pw[i-],flag^=)
{
for (k=flag*pw[i-];k<=pw[n];k+=pw[i])
{
if (j-pw[i-]>=)
a[j][k]+=a[j-pw[i-]][k];
if (j+pw[i-]<=pw[n])
a[j][k]+=a[j+pw[i-]][k];
if (k-pw[i-]>=)
a[j][k]+=a[j][k-pw[i-]];
if (k+pw[i-]<=pw[n])
a[j][k]+=a[j][k+pw[i-]];
a[j][k]+=d;
a[j][k]%=Mod;
}
}
}
for (i=;i<=pw[n];i++)
for (j=;j<=pw[n];j++)
ans+=a[i][j],ans%=Mod;
cout<<ans;
}

计蒜客NOIP模拟赛6 D1T1Diamond-square的更多相关文章

  1. 计蒜客NOIP模拟赛4 D2T1 鬼脚图

    鬼脚图,又称画鬼脚,在日本称作阿弥陀签,是一种经典游戏,也是一种简易的决策方法,常常用来抽签或决定分配组合. 下图就是一张鬼脚图,其包含若干条竖线和若干条横线.请注意,横线只能水平连接相邻的两条竖线, ...

  2. 计蒜客 NOIP模拟赛(3) D1T1火山喷发

    火山喷发对所有附近的生物具有毁灭性的影响.在本题中,我们希望用数值来模拟这一过程. 在环境里有 nnn 个生物分别具有 A1,A2,⋯,An​​点生命值,一次火山喷发总计 M轮,每轮造成 1点伤害,等 ...

  3. 计蒜客NOIP模拟赛(2) D1T1邻家男孩

    凡是一个具有领导力的孩子.现实生活中他特别喜欢玩一个叫做 UNO 的纸牌游戏,他也总是带着其他小朋友一起玩,然后战胜他们.慢慢地,他厌倦了胜利,于是准备发明一种新的双人纸牌游戏. 初始时,每个人手中都 ...

  4. 计蒜客NOIP模拟赛5 D1T1 机智的 AmyZhi

    那年一个雨季,AmyZhi 在校门外弯身买参考书. 这时 SiriusRen 走过来,一言不合甩给她一道“自认为”很难的题: --------------- 给你一个数字 NN(NN 的范围是 11  ...

  5. 计蒜客NOIP模拟赛4 D2T2 跑步爱天天

    YOUSIKI 在 noip2016 的一道<天天爱跑步>的题爆零后,潜心研究树上问题,成为了一代大师,于是皮皮妖为了测验他,出了一道题,名曰<跑步爱天天>. 有一个以 1 为 ...

  6. 计蒜客NOIP模拟赛4 D1T3 小X的佛光

    小 X 是远近闻名的学佛,平日里最喜欢做的事就是蒸发学水. 小 X 所在的城市 X 城是一个含有 N 个节点的无向图,同时,由于 X 国是一个发展中国家,为了节约城市建设的经费,X 国首相在建造 X ...

  7. 计蒜客NOIP模拟赛4 D1T2小X的密室

    小 X 正困在一个密室里,他希望尽快逃出密室. 密室中有 N 个房间,初始时,小 X 在 1 号房间,而出口在 N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会单向地创造一条 ...

  8. 计蒜客NOIP模拟赛4 D1T1 小X的质数

    小 X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小 X 认为,质数是一切自然数起源的地方. 在小 X 的认知里,质数是除了本身和 1以外,没有其他因数的数字. 但由于小 X ...

  9. 计蒜客NOIP模拟赛D2T3 数三角形

    刚刚上高中的洁洁在学习组合数学的过程中遇到一道麻烦的题目,她希望你能帮助她解决.给定一张无向完全图 G,其中大部分边被染成蓝色,但也有一些边被染成红色或者绿色.现在,洁洁需要给这张图的多样性进行打分. ...

随机推荐

  1. bug终结者 团队作业第二周

    bug终结者 团队作业第二周 我们小组选取游戏"开心消消乐",回答问题: 1. 此类软件是什么时候开始出现的, 这些软件是怎么说服你(陌生人)成为他们的用户的? 他们的目标都是盈利 ...

  2. C/C++生成随机数

    一.rand和srand   在C++11标准出来之前,C/C++都依赖于stdlib.h头文件的rand或者srand来生成随机数.   其不是真正的随机数,是一个伪随机数,是根据一个数(我们可以称 ...

  3. Django 基本设置

    建立django目录,为了独立区分app和主站的关系,需要把app完全和主站分离 app/views.py from django.shortcuts import render from djang ...

  4. Entity Framework Core Code First

    参考地址:https://docs.microsoft.com/zh-cn/ef/core/get-started/aspnetcore/new-db

  5. BizTalk 2016 配置 RosettaNet遇到的坑

    本文只针对已经安装好BizTalk 2016 需要在安装RosettaNet加速器的伙伴. IIS配置 权限问题 错误信息 Failed to get IIS metabase property. E ...

  6. 说说Java代理模式

    代理实现可以分为静态代理和动态代理. 静态代理 静态代理模式其实很常见,比如买火车票这件小事:黄牛相当于是火车站的代理,我们可以通过黄牛买票,但只能去火车站进行改签和退票.在代码实现中相当于为一个委托 ...

  7. SSM中的登陆验证码

    @Autowired private Producer captchaProducer = null; /** * 后台登录验证码 * @param request * @param response ...

  8. python/基础输出输入用法

    输出及输入的简单用法 print print,中文意思是打印,在python里它不是往纸上打印,而是打印在命令行,或者叫终端.控制台里面.print是python里很基本很常见的一个操作,它的操作对象 ...

  9. 如何在pycharm中使用配置好的virtualenv环境

    1.手动建立: 第一步 建立虚拟环境 Windows cmd: pip install virtualenv 创建虚拟环境目录 env 激活虚拟环境 C:\Python27\Scripts\env\S ...

  10. FreeMarker的用法

    freemark就是一个对静态页面上的标签进行动态解析.填充数据的一个框架. 语法(转:http://zhuyuehua.iteye.com/blog/1975251):  1. freemarker ...