话说小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. 匿名内部类和Lambda表达式是一样的吗?

    先看一下匿名内部类长什么样子: 1 package com.jvm.demo.test2; 2 3 public class InnerClassTest { 4 5 public static vo ...

  2. php curl 获取请求头与DNS解析

    1 php-curl方法相关设置具体方法在最下方的示例函数有相关编著, 这里主要描述两个小众需求a 设置访问DNS解析问题点: get请求网页获取返回值速度很快, 但是使用curl请求数据时, 响应速 ...

  3. 警惕char类型直接相加

    今天在写某个程序需要对两个数字字符串进行相加操作,比如字符串1:12345,字符串2:23456.需要1和2相加.2和3相加.就是两个字符相同位置的数进行相加. 这个一看很好完成,写一个for,然后取 ...

  4. mysql任意文件读取漏洞复现

    前言 第一次得知该漏洞后找了一些文章去看. 一开始不明白这个漏洞是怎么来的,只知道通过在服务端运行poc脚本就可以读取客户端的任意文件,直接找到网上准备好的靶机进行测试,发现可行,然后就拿别人的poc ...

  5. 异步编程新方式async/await

    一.前言 实际上对async/await并不是很陌生,早在阮大大的ES6教程里面就接触到了,但是一直处于理解并不熟练使用的状态,于是决定重新学习并且总结一下,写了这篇博文.如果文中有错误的地方还请各位 ...

  6. day47 Pyhton 数据库Mysql 04

    # 表结构 # 建表 - 表的增加 # create table # 删表 - 表的删除 # drop table # 改表 - 表的修改 # alter table 表名 # rename 新表名 ...

  7. 机器学习:集成学习:随机森林.GBDT

    集成学习(Ensemble Learning) 集成学习的思想是将若干个学习器(分类器&回归器)组合之后产生一个新学习器.弱分类器(weak learner)指那些分类准确率只稍微好于随机猜测 ...

  8. 【xenomai内核解析】系列文章大纲

    xenomai内核解析 本博客为本人学习linux实时操作系统框架xenomai的一些记录,主要剖析xenomai内核实现,以及与linux相关的知识.方便读者定位具体文章,现列出本博客大纲,后续会陆 ...

  9. apache自带的ab测试失败请求原因

    只要出现 Failed requests 就会多出现一行要求失败的各原因的数据统计,分别有 Connect, Length, 与 Exception 三种,分别代表的意义为:Connect       ...

  10. Python之format字符串格式化

    1.字符串连接 >>> a = 'My name is ' + 'Suen' >>> a 'My name is Suen' >>> a = 'M ...