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. Alpha冲刺No.2

    冲刺Day2 一.站立式会议计划 分组讨论研究:较好的掌握MYSQL的使用,以及Android Studio图形化界面设计的学习同步进行. 完成设计数据库架构,进阶版. 登录.注册界面的设计. 能从同 ...

  2. 项目Alpha冲刺Day5

    一.会议照片 二.项目进展 1.今日安排 熟悉后台框架并尝试编写及继续搭建前台框架模版.完成登录相关的功能实现,添加一些用户相关的单元测试代码,以及相应的测试数据. 2.问题困难 前端不是很熟,页面框 ...

  3. Week03-面向对象入门

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词,如类.对象.封装等 类 对象 封装 继承 覆盖 重载 构造函数 static public private toString f ...

  4. Twisted 使用多线程

    Twisted 提供主线程和辅线程,主线程只有1个,即reactor.run(),辅线程有多个,可以自由配置 Twisted 大多数代码运行在主线程中,dataReceived(),connectio ...

  5. 利用Python爬取新浪微博营销案例库并下载到本地

    from bs4 import BeautifulSoup import requests,urllib.request,urllib.parse import json import time im ...

  6. 【iOS】Swift LAZY 修饰符和 LAZY 方法

    延时加载或者说延时初始化是很常用的优化方法,在构建和生成新的对象的时候,内存分配会在运行时耗费不少时间,如果有一些对象的属性和内容非常复杂的话,这个时间更是不可忽略.另外,有些情况下我们并不会立即用到 ...

  7. JAVA中if多分支和switch的优劣性。

    Switch多分支语句switch语句是多分支选择语句.常用来根据表达式的值选择要执行的语句.例如,在某程序中,要求将输入的或是获取的用0-6代表的星期,转换为用中文表示的星期.该需求通过伪代码描述的 ...

  8. 201621123027 《Java程序设计》第1周学习总结

    01621123027 <Java程序设计>第1周学习总结 1.本周学习总结 关键词:总概.承接.面向对象化 ​ 我认为第一周的Java学习是一些总结概括性质的内容,在比较联系之前学习过的 ...

  9. JVM启动参数

    JVM参数的含义 实例见实例分析 参数名称 含义 默认值   -Xms 初始堆大小 物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,J ...

  10. vue内置指令详解——小白速会

    指令 (Directives) 是带有 v- 前缀的特殊属性,职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM. 内置指令 1.v-bind:响应并更新DOM特性:例如:v-bi ...