话说小X在孩提时,都会做标准的蛇形矩阵了,发现很好玩。现在的小X很想对其进行改版,变为如下类型的一个无限大蛇形数阵:

令S(x)表示以1为左上角,x为右下角的矩形内所有数之和。例如S(12)就是具有深色背景的数之和。
给定n,对于“以1为左上角,n为右下角的矩形”内的每一个数i,计算所有S(i)之和。例如,当n=8时,所求结果为S(1)+S(2)+S(9)+S(4)+S(3)+S(8)=1+3+12
+5+10+27=58。

输入格式:

输入文件仅包含一个整数n

输出格式:

输出所求结果除以1,000,000,007的余数。。

样例输入:

12

样例输出:

282

数据范围:

对于20%的数据满足1<=n<=102;
对于40%的数据满足1<=n<=5000;
对于60%的数据满足1<=n<=106;
对于100%的数据满足1<=n<=1010。

时间限制:

1s

空间限制:

256m

 

数论

这道题O(n)的算法是很好想的,只要模拟n次,将数字为n的坐标和矩阵中每个数和位置处理出来

然后可以发现对于矩阵来说,每个数被累加到的次数为这一点到矩阵右下角的子矩阵大小

即$ans=\sum_{i}\sum_{j}a_{i,j}*(x-i+1)*(y-j+1)$

比如12的矩阵中,8被累加的次数为4次

那么就可以统计答案了

但O(n)的算法不足以解决这道题

可以发现可以在O(1)的时间内处理出一个数的位置

那么可以将这个矩阵划分成一个在这个矩阵中最大的正方形和若干条宽度为一的矩形

一个正方形也可以划分成几个“7”字型,那么对于这个"7"字形和宽度为一的矩形可以O(1)的处理出答案

那么总复杂度为$O(\sqrt{n})$

那么“7”字形公式推导过程如下

此处仅以奇数的正方形的"7"为例

设当前为第$i$个正方形,整个矩阵的右下角为$(x,y)$

右上的数为$i^{2}$坐标$(i,i)$,左下的数为$(i-1)^{2}+1$,坐标$(i,1)$,中间拐点处为右上和左下数的平均数,坐标$(i,i)$

那么将这个"7"切成一条竖的和一条横着边

如9所在的"7"字形,将其切成7-9和5-7两个边

那么下条边答案为

$((i-1)^{2}+1)*(x-i+1)*y+((i-1)^{2}+1+1)*(x-i+1)*(y-1)+...+((i-1)^{2}+1+i-1)*(x-i+1)*(y-i+1)$

设$s=(i-1)^{2}+1$

$s*(x-i+1)*y+(s+1)*(x-i+1)*(y-1)+...+(s+i-1)*(x-i+1)*(y-i+1)$

$(x-i+1)*[s*y+(s+1)*(y-1)+...+(s+i-1)*(y-i+1)]$

$(x-i+1)*[i*s*y+\sum_{j=1}^{i-1}(y-s)-\sum_{k=1}^{i-1}k^{2}]$

$(x-i+1)*[i*s*y+\frac{i*(i-1)}{2}(y-s)-\frac{i*(i-1)*(2*i-1)}{6}]$

即为公式,那么上条边同理

$(y-i+1)*[i*s*x-\frac{i*(i-1)}{2}(x+s)+\frac{i*(i-1)*(2*i-1)}{6}]$

$s=i^{2}$

因为统计了中间拐点的答案两次

最后再减去中间拐点的答案即可

其他同理,可以推出相同形式的公式

#include <bits/stdc++.h>
#define ll long long
#define mod (ll)1000000007
using namespace std;
ll n,m,ans;
ll findx(ll num)
{
ll s;
s=(ll)sqrt(num);
if (s*s==num)
{
if (s&1)
return 1;
else
return s;
}
ll mid;
s++;
mid=((s-1)*(s-1)+1+s*s)>>1;
if (num>=mid)
{
if (s&1)
return s-(num-mid);
else
return s;
}
else
{
if (s&1)
return s;
else
return s-(mid-num);
}
}
ll findy(ll num)
{
ll s;
s=(ll)sqrt(num);
if (s*s==num)
{
if (s&1)
return s;
else
return 1;
}
ll mid;
s++;
mid=((s-1)*(s-1)+1+s*s)>>1;
if (num>=mid)
{
if (s&1)
return s;
else
return s-(num-mid);
}
else
{
if (s&1)
return s-(mid-num);
else
return s;
}
}//O(1)的时间处理出坐标
int main()
{
scanf("%lld",&n);
ll x,y;
x=findx(n);y=findy(n);
m=min(x,y);
for (ll i=m;i>=1;i--)
{
ll mid;
mid=((i-1)*(i-1)+1+i*i)>>1;
if (i&1)
{
ll s;
s=i*i;
s%=mod;
ans=ans+(i*x%mod*s%mod+i*(i-1)*(2*i-1)/6-i*(i-1)/2*(s+x)%mod+mod)%mod*(y-i+1)%mod;
ans%=mod;
s=i*i-2*i+2;
s%=mod;
ans=ans+(i*s%mod*y%mod-i*(i-1)*(2*i-1)/6+i*(i-1)/2*(y-s)%mod+mod)%mod*(x-i+1)%mod;
ans%=mod;
ans=(ans-mid*(x-i+1)%mod*(y-i+1)%mod+mod)%mod;
}
else
{
ll s;
s=i*i-2*i+2;
s%=mod;
ans=ans+(i*s%mod*x%mod-i*(i-1)*(2*i-1)/6+i*(i-1)/2*(x-s)%mod+mod)%mod*(y-i+1)%mod;
ans%=mod;
s=i*i;
s%=mod;
ans=ans+(i*y%mod*s%mod+i*(i-1)*(2*i-1)/6-i*(i-1)/2*(s+y)%mod+mod)%mod*(x-i+1)%mod;
ans%=mod;
ans=(ans-mid*(x-i+1)%mod*(y-i+1)%mod+mod)%mod;//减去中间拐点的值
}
ans=(ans+mod)%mod;
}
for (ll i=m+1;i<=y;i++)
{
if (i&1)
{
ll s;
s=i*i;
s%=mod;
ans=ans+(x*x%mod*s%mod+x*(x-1)*(2*x-1)/6-x*(x-1)/2*(s+x)%mod+mod)%mod*(y-i+1)%mod;
ans%=mod;
}
else
{
ll s;
s=i*i-2*i+2;
s%=mod;
ans=ans+(x*s%mod*x%mod-x*(x-1)*(2*x-1)/6+x*(x-1)/2*(x-s)%mod+mod)%mod*(y-i+1)%mod;
ans%=mod;
}
ans=(ans+mod)%mod;
}
for (ll i=m+1;i<=x;i++)
{
if (i&1)
{
ll s;
s=(i*i-2*i+2);
s%=mod;
ans=ans+(y*s%mod*y%mod-y*(y-1)*(2*y-1)/6+y*(y-1)/2*(y-s)%mod+mod)%mod*(x-i+1)%mod;
ans%=mod;
}
else
{
ll s;
s=i*i;
s%=mod;
ans=ans+(y*y%mod*s%mod+y*(y-1)*(2*y-1)/6-y*(y-1)/2*(s+y)%mod+mod)%mod*(x-i+1)%mod;
ans%=mod;
}
ans=(ans+mod)%mod;
}
printf("%lld\n",(ans+mod)%mod);
}

XJOI 夏令营501-511NOIP训练17 蛇形数阵的更多相关文章

  1. 夏令营501-511NOIP训练17——蛇形矩阵

    传送门:QAQQAQ 题意:话说小X在孩提时,都会做标准的蛇形矩阵了,发现很好玩.现在的小X很想对其进行改版,变为如下类型的一个无限大蛇形数阵:令S(x)表示以1为左上角,x为右下角的矩形内所有数之和 ...

  2. XJOI夏令营501训练1——分配工作

    传送门:QAQQAQ 题意:某公司有工作人员x1,x2,…,xn ,他们去做工作y1,y2,…,ym(n<=m) ,每个人都能做其中的几项工作,并且对每一项工作都有一个固定的效率.问能否找到一种 ...

  3. 算法训练 K好数

      算法训练 K好数   时间限制:1.0s   内存限制:256.0MB 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数 ...

  4. 算法训练 K好数 解析

    算法训练 K好数 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K ...

  5. ZROI1153 【线上训练3】数个数

    ZROI1153 [线上训练3]数个数 传送门 一道非常有意思的题,涵盖了各种知识点. 首先,很显然,这是个容斥.容斥可以过掉\(30pts\). 这里我们考虑容斥+DP. 我们令\(dp[i][j] ...

  6. Java实现 蓝桥杯 算法训练 K好数

    算法训练 K好数 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K ...

  7. Java实现 蓝桥杯VIP 算法训练 麦森数

    算法训练 麦森数 时间限制:1.0s 内存限制:256.0MB 问题描述 形如2P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2P-1不一定也是素数.到1998年底, ...

  8. XJOI 夏令营501-511NOIP训练18 高二学堂

    在美丽的中山纪念中学中,有座高二学堂,同样也是因为一个人,让它们变 成了现在这个样子~那就是我们伟大的级主任.因为他,我们又迎来了一个木有电影,只有对答案的段考日:又迎来了一个不是大礼拜,而是小礼拜的 ...

  9. XJOI 夏令营501-511NOIP训练18 高三楼

    参观完各种饭堂,学校还有什么著名的景点呢?当然是教室了,此时此刻我 们来到了高三楼.你会发现高三楼门口会有以身份认证系统,这东西还有着一段疼人的历史.每年的九月到来,高三的童鞋大多不习惯学校的作息时间 ...

随机推荐

  1. 【随笔】Apache降权和禁用PHP危险函数

    测试环境: Windows Server 2003 + phpstudy 首先在win2003里运行phpstudy,这里注意需要选择应用系统服务模式,应用之后重启phpstudy. 打开系统服务(开 ...

  2. Arduino重置-复位问题

    转自: https://blog.csdn.net/y511374875/article/details/77845240 三种方式手动重启Arduino 1.Arduino板上重新编写代码时,Ard ...

  3. MFC 简介

    参考:https://baike.baidu.com/item/MFC/2236974 MFC (微软基础类库) 编辑 锁定 讨论999   MFC(Microsoft Foundation Clas ...

  4. 1.入门篇十分钟了解Spring Cloud

    文章目录 Spring Cloud入门系列汇总 为什么需要学习Spring Cloud 什么是Spring Cloud 设计目标与优缺点 设计目标 优缺点 Spring Cloud发展前景 整体架构 ...

  5. Docker 开启非认证的2375端口,提供外部访问 Docker

    1.编辑 Docker 服务的配置文件 vi /usr/lib/systemd/system/docker.service 或者 vi /lib/systemd/system/docker.servi ...

  6. RHSA-2017:1931-中危: bash 安全和BUG修复更新(代码执行)

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...

  7. 透视HTTPS建造固若金汤的城堡

    为什么有 HTTPS?因为 HTTP 不安全! 现在的互联网已经不再是 "田园时代","黑暗森林" 已经到来.上网的记录会被轻易截获,网站是否真实也无法验证,黑 ...

  8. Avoid mutating a prop directly since the value will be overwritten whenever the parent component re

    子组件修改父组件的值踩坑 Vue1.0升级至2.0之后,直接在子组件修改父组件的值是会报错的 目的是为了阻止子组件影响父组件的数据. 我们都知道在vue中,父组件传入子组件的变量是存放在props属性 ...

  9. Git之多人协同开发

    一.获取远程库信息 1 2 3 $ git remote -v origin  https://github.com/xxxxx/node.git (fetch) origin  https://gi ...

  10. 联赛%你测试10T2:漫无止境的八月

    题意: 思路: 有几个特殊的性质: 在不考虑q里面的单点修改,我们先只判断一个序列是否Yes. 我们注意到每次操作都是对一个长度为k的区间进行区间加减1的操作,所以我们如果将序列里面的数按%k分组,把 ...