CF#462 div1 D:A Creative Cutout

题目大意:

原网址戳我!

题目大意:

在网格上任选一个点作为圆中心,然后以其为圆心画\(m\)个圆。

其中第\(k\)个圆的半径为\(\sqrt{k}\),\(m\)个圆的编号依次为\(1\)~\(m\)。

定义一个格点的美妙值\(g(x,y)\)为包含了它的所有圆的编号之和。

定义\(f(n)\)为:当画了\(n\)个圆时,\(f(n) = \sum_{i,j\in R} g(i,j)\)。

现在非常变态的问你一个非常无聊的恶心问题:

给定一个\(m\)(\(m\leq 10^{12}\)),请计算\(ans = \sum_{i = 1}^m f(i)\ mod\ 1000000007\)

样例与样例解释

样例输入输出

\(Input\):5

\(Output\):387

样例说明:

样例中,当\(n = 5\)时圆的分布情况如下图所示:

当\(n = 5\)时,如图

有\(5\)个红色的点被圆1、2、3、4、5包含 , 它们的\(r = \sum_{i = 1}^5 i = 15\)

有\(4\)个橘色的点被圆2、3、4、5包含,它们的\(r = \sum_{i = 2}^5 i = 14\)

有\(4\)个绿色的点被圆4、5包含,它们的\(r = \sum_{i = 4}^5 i = 9\)

有\(8\)个蓝色的点被圆5包含 , 它们的\(r = 5\)

剩下的灰色的点则不被任意一个圆包含,它们的\(r = 0\)

综上,\(f(5) = 5\times 15 + 4\times 14 + 4\times 9 + 8\times 5 = 207\)

同理可得\(f(1)\)=\(5\)、\(f(2)\)=\(23\)、\(f(3)\)=\(50\)、\(f(4)\)=\(102\)。

所以当\(m = 5\)时 , \(ans = \sum_{i = 1}^5 f(i) = 5+23+50+102+207 = 387\)

解法与思路

这TM比 \(E\)题 还要难好多好吗?

这里方便叙述我们以圆心为原点建立坐标轴。

对于一个\(f(n)\),我们可以计算出每一个坐标的贡献:

\(res_n = \sum_{k = x^2 + y^2} ^ n k = \frac{(n+(x^2+y^2))(n-(x^2+y^2)+1)}{2}=\frac{n(n+1) - (x^2+y^2)(x^2+y^2-1)}{2}\)

转换一下得到:\(res = \binom{n+1}{2} - \binom{x^2+y^2}{2}\)

令\(L = x^2 + y^2\),则每一个\(L\)的答案的贡献为:

\(Res_L = \sum_{k = L}^m (\binom{k+1}{2} - \binom{x^2+y^2}{2}) = \sum_{k = L}^m \binom{k+1}{2} - (m - L +1)\binom{L}{2}\)

然后这里有一个组合公式( 提示 ):

公式:\(\sum_{k = L}^R \binom{k}{w} = \binom{R+1}{w+1} - \binom{L}{w+1}\)

用归纳法证明:

当\(L = R = 1\)时,\(\sum_{k=1}^1\binom{1}{1} = \binom{2}{2} - \binom{1}{2} = 1\)成立。

\(\sum_{k = L}^{R+1}\binom{k}{w} = \binom{R+1}{w}+\sum_{k=L}^R\binom{k}{w} = [\binom{R+1}{w+1}+ \binom{R+1}{w}] - \binom{L}{w+1}\)

由组合数的计算公式可得\(\binom{R+1}{w+1}+ \binom{R+1}{w} = \binom{R+2}{w+1}\)

所以\(\sum_{k = L}^{R+1} \binom{k}{w} = \binom{R+2}{w+1} - \binom{L}{w+1}\)依旧成立。

同理可以证明\(L\)变化到\(L+1\)此结论任符合。

综上:\(\sum_{k = L}^R \binom{k}{w} = \binom{R+1}{w+1} - \binom{L}{w+1}\)

我们套用这个公式:

\(Res_L = \binom{m+2}{3} - \binom{L+1}{3} - (m-L+1)\binom{L}{2}\)

\(Res_L = \frac{1}{6}(\frac{(m+2)!}{(m-1)!} - \frac{(L+1)!}{(L-2)!} - (m-L+1)\frac{3L!}{(L-2)!})\)

暴力化简一顿之后得到:

\[Res_L = \frac{1}{6}[\ 2L^3-3(m+2)L^2+(3m+4)L+m(m+1)(m+2)\ ]
\]

嗯,一个关于\(L\)的多项式。

考虑一下枚举\(x^2\) 与 \(y^2\)的话:

令\(L = x^2 + y^2\)的话,带入原式中可以得到:

\(Res_L = \frac{1}{6}(\)

\(\ \ \ \ \ 2*y^6+\)

\(\ \ \ \ (6x^2-(3m+6))*y^4+\)

\(\ \ \ \ (6x^4-2(3m+6)x^2+(3m+4))*y^2+\)

\(\ \ \ \ (2x^6-(3m+6)x^4+(3m+4)x^2+(m)(m+1)(m+2))*y^0\)

\()\)

等于说,我们如果枚举了\(x\),那么上面除\(y\)以外其它的都是系数(常数)。

我们把它命名为一个关于\(y\)的函数\(S_x(y)\),那么答案可以写为:

\[Ans = \frac{1}{6}\sum_{x \in Z }^{x^2 \leq m}\ \sum_{y\in Z}^{y^2 \leq m - x^2} S_x(y)
\]

所以说,我们只需要枚举\(x\),然后计算\(\sum_{y\in Z}^{y^2 \leq m - x^2} S_x(y)\)即可。

而\(S_x(y)\)中,我们只需要计算\(y^2\)、\(y^4\)、\(y^6\)即可。

然后对于上面这三项,我们单独算答案,可以直接套数学公式:

\(\sum_{i=1}^{N}i^{2}=\frac{N(N+1)(2N+1)}{6}\)

\(\sum_{i=1}^{N}i^{4}=\frac{N(N+1)(2N+1)(3N^2+3N-1)}{30}\)

\(\sum_{i=1}^{N}i^{6}=\frac{N(N+1)(2N+1)(3N^4+6N^3-3N+1)}{42}\)

求\(\sum_{i=1}^N i^{2t}\)的\(O(1)\)公式,用\((r+1)^{2t+1} - r^{2t+1}\)变形即可得到。

枚举\(x\)只需要枚举\(\sqrt{m}\)次,所以总的复杂度为\(O(\sqrt{m})\)。

实现代码:

注意不要暴\(int64\)了!!

枚举\(x\)直接从\(-\sqrt{m}\)枚举到\(\sqrt{m}\)即可,省去讨论的麻烦。

#include<bits/stdc++.h>
#define ll long long
#define MOD 1000000007
using namespace std;
ll mod(ll e){ e %= MOD; if(e < 0)e += MOD; return e; } ll inv6 , inv30 , inv42;
ll f[5] , n , m , x , y , x2 , x4 , x6 , ans; ll Pow(ll T , ll js , ll S){
while(js){ if(js&1)S = mod(S * T);
T = mod(T * T); js >>= 1; } return S;
}
ll sum(ll i , ll k){
if(k == 0)return mod( 2*i + 1 );
ll s0 = mod( 2 * mod( mod( i * (i+1) ) * mod(2*i + 1) ) );
if(k == 2)return mod(inv6 * s0);
ll t0 , t1 , t2 , t3 , t4;
t0 = 1; t1 = i; t2 = mod(i * i); t3 = mod(t1 * t2); t4 = mod(t2 * t2);
if(k == 4)return mod(inv30 * mod(s0 * mod( mod(3 * t2) + mod(3 * t1) - t0 )));
if(k == 6)return mod(inv42 * mod(s0 * mod(mod(3*t4) + mod(6*t3) - mod(3*t1) + t0) ) );
} int main(){
ans = 0; cin >> m; n = sqrt(m);
f[0] = mod( mod(mod(m) * mod(m+1)) * mod(m+2) ); //注意这里别爆int64了!
f[1] = mod( 3*m + 4 );
f[2] = mod( -1 * (3*m + 6) );
f[3] = 2;
inv6 = Pow(6 , MOD - 2 , 1);
inv30 = Pow(30 , MOD - 2 ,1);
inv42 = Pow(42 , MOD - 2 , 1);
for(ll x = -n; x <= n; x ++){
y = sqrt(m - x * x);
x2 = mod(x * x); x4 = mod(x2 * x2); x6 = mod(x2 * x4);
ans = mod( ans + mod(f[3] * sum(y , 6)) );
ans = mod( ans + mod( mod( mod(6 * x2) + f[2] ) * sum(y , 4) ) );
ans = mod( ans + mod( mod(mod(6 * x4) + mod(mod(2 * f[2])*x2) + f[1]) * sum(y , 2)) );
ans = mod( ans + mod(mod(f[3]*x6) + mod(f[2]*x4) + mod(f[1]*x2) + f[0]) * sum(y , 0) );
ans = mod( ans );
}
ans = mod( ans * inv6 ); cout << ans; return 0;
}

CF#462 div1 D:A Creative Cutout的更多相关文章

  1. CF#345 (Div1)

    论蒟蒻如何被cf虐 以下是身败名裂后的题解菌=========== Div1 A.Watchmen 有n个点,每个点有一个坐标.求曼哈顿距离=欧几里得距离的点对数量. 只需要统计x或y一样的点对数量. ...

  2. codeforces284 div1 B:概率dp

    蛋疼的期末..好久没有A题了,,惭愧啊 昨晚打起精神准备做cf 结果竟然忘记注册了..拿学长号看了看题,今早起来补了一道dp 题目大意: 有n首歌,你需要边听边猜 对于第 i 首歌 每听一分钟你猜出它 ...

  3. CF #356 div1 A. Bear and Prime 100

    题目链接:http://codeforces.com/contest/679/problem/A CF有史以来第一次出现交互式的题目,大致意思为选择2到100中某一个数字作为隐藏数,你可以询问最多20 ...

  4. codeforces 933D A Creative Cutout

    题目链接 正解:组合数学. 充满套路与细节的一道题.. 首先我们显然要考虑每个点的贡献(我就不信你能把$f$给筛出来 那么对于一个点$(x,y)$,我们设$L=x^{2}+y^{2}$,那么它的贡献就 ...

  5. CF #228 div1 B. Fox and Minimal path

    题目链接:http://codeforces.com/problemset/problem/388/B 大意是用不超过1000个点构造一张边权为1的无向图,使得点1到点2的最短路的个数为给定值k,其中 ...

  6. CF #349 div1 B. World Tour

    题目链接:http://codeforces.com/problemset/problem/666/B 大意是给一张有向图,选取四个点,使得走这四个点,任意两个点之间走最短路,总距离最长. 3000个 ...

  7. CF #335 div1 A. Sorting Railway Cars

    题目链接:http://codeforces.com/contest/605/problem/A 大意是对一个排列进行排序,每一次操作可以将一个数字从原来位置抽出放到开头或结尾,问最少需要操作多少次可 ...

  8. CF #345 Div1 D Zip-line

    题目链接:http://codeforces.com/contest/650/problem/D 大意是给一个数组,若干询问,每一次把一个数字改为另一个数字,问当前数组最长上升子序列,询问之间是独立的 ...

  9. CF #299 div1 B. Tavas and Malekas KMP-next数组

    题目链接:http://codeforces.com/contest/536/problem/B 一个原始字符串,一个未知字符串,每一次从pos[i]开始覆盖未知字符串,问最后字符串的形式,以及判断过 ...

随机推荐

  1. PHP中常用操作文件的方法

    文件夹的创建: mkdir系统函数,第一个参数是路径,第二个参数是权限,第三个参数是是否递归创建,默认权限是0777最大权限,在windows下没有所谓的权限,在linux下可以设置权限,如果目录存在 ...

  2. Git团队协作之GitFlow & SoucceTree

    GitFlow 定义了一个围绕项目发布的严格的分支模型,仍然使用中央仓库作为开发者的交互中心 GitFlow分支 Master分支 Hotfix紧急修改 Release分支 Develop开发分支 F ...

  3. 哪些CSS是可以被继承的--简单整理

    那些CSS是可以被继承的--简单整理1.文本相关属性是继承的:font-size,font-family,line-height,text-index等2.列表相关属性是继承的:list-style- ...

  4. FTP主动模式和被动模式

    FTP主动模式和被动模式 FTP是仅基于TCP的服务,不支持UDP.与众不同的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口).通常来说这两个端口是21(命令端口)和20(数据端口 ...

  5. 转:【web前端开发】浏览器兼容性处理大全

    解决思路: ①.写代码的时候遵循W3C标准,按照最新稳定版本的IE或WebKit内核浏览器进行编码 ②.遇到部分无法全面解决浏览器兼容的时候,采取CSS的hack手段进行针对性微调.简单的说,CSS ...

  6. 使用Netbeans内置的Git工具

    在 NetBeans IDE 中使用 Git 支持 NetBeans IDE 为 Git 版本控制客户端提供支持.通过利用 IDE 的 Git 支持,您可以从 IDE 内的项目中直接执行版本控制任务. ...

  7. Egret学习笔记 (Egret打飞机-9.子弹对敌机和主角的碰撞)

    运行起来,虽然主角飞机和敌机都在互相发射子弹,但是子弹打中了就和没打中效果是一样的.. 这一章我们就来处理子弹和飞机的碰撞问题. 我们所有的操作都是基于Main这个容器来做的.所以我就把这个处理放到M ...

  8. POJ - 3279 枚举 [kuangbin带你飞]专题一

    这题很经典啊,以前也遇到过类似的题--计蒜客 硬币翻转. 不过这题不仅要求翻转次数最少,且翻转方案的字典序也要最小. 解法:二进制枚举第一行的翻转方案,然后处理第二行,如果第二行的k列的上一列是黑色, ...

  9. Java线程编程中isAlive()和join()的使用详解

    一个线程如何知道另一线程已经结束?Thread类提供了回答此问题的方法. 有两种方法可以判定一个线程是否结束.第一,可以在线程中调用isAlive().这种方法由Thread定义,它的通常形式如下: ...

  10. mysql数据库 索引 事务和事务回滚

    mysql索引 索引相当于书的目录优点:加快数据的查询速度缺点:占物理存储空间,添加,删除,会减慢写的速度 查看表使用的索引 mysql> show index from 表名\G;(\G分行显 ...