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. C语言博客作业—嵌套循环

    一.PTA实验作业 题目1:7-4 换硬币 1. 本题PTA提交列表 2. 设计思路 (1)定义整型变量money表示待换的零钱总额,p5表示5分硬币的数量,p2表示2分硬币的数量,p1表示1分硬币的 ...

  2. TensorFlow实现Softmax Regression识别手写数字中"TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败”问题

    出现问题: 在使用TensorFlow实现MNIST手写数字识别时,出现"TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应 ...

  3. Beta开始前准备

    Beta准备 1. 讨论组长是否重选的议题和结论. 经过讨论,我们认为,经过一段时间的磨合,现任组长是不需要更换的. 2. 下一阶段需要改进完善的功能. 增加关于征信的功能,贴近选题主题 美化界面,尽 ...

  4. JAVA对象克隆

    1> 为了获取对象的一份拷贝,我们可以利用Object类的clone()方法. 2> 在派生类中覆盖基类的clone(),并声明为public.3> 在派生类的clone()方法中, ...

  5. 数据故障的恢复-MSSQL ndf文件大小变为0 KB恢复过程

    一.故障描述 成都某客户,存储损坏,数据库崩溃.重组存储,恢复数据库文件,发现有四个ndf文件大小变为0 KB.数据库大小约80TB.数据库中有1223个文件,数据库每10天生成一个NDF文件,每个N ...

  6. Windows Server2012 故障转移集群之动态仲裁(Dynamic Quorum)

    本篇文章主要介绍Windows2012的故障转移集群一个新功能“动态仲裁”,默认该功能是开启的: 动态仲裁能在当前群集投票出现分歧的情况下取消某些节点的投票权限,比如偶数个节点的群集环境.仲裁见证和动 ...

  7. JQuery 动态加载iframe.

    html: <iframe id="ifm" style="width:inherit;height:inherit" runat="serve ...

  8. 九、Python发送QQ邮件(SMTP)

    看了廖雪峰老师的教程: 一封电子邮件的旅程就是 发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- 收件人 ...

  9. php里面的变量的使用

    php里面的变量一般可以直接使用不需要声明,但是这种var_dump($a);就会报错,还有sql语句里面如果某个变量为空也会报错. 如果变量为null,空,未声明都==false,但是不===fal ...

  10. GIT入门笔记(16)- 分支创建和管理

    查看分支:git branch创建分支:git branch <name>切换分支:git checkout <name>创建+切换分支:git checkout -b < ...