ZOJ 3903 Ant ZOJ Monthly, October 2015 - A
Ant
Time Limit: 1 Second Memory Limit: 32768 KB
There is an ant named Alice. Alice likes going hiking very much. Today, she wants to climb a cuboid. The length of cuboid's longest edge is n, and the other edges are all positive integers. Alice's starting point is a vertex of this cuboid, and she wants to arrive at the opposite vertex. The opposite vertex means the vertex which has no common planes or edges with the starting point. Just like the picture below:

Alice is very clever, she always walks on the shortest path. But she can only walk on the surface of the cuboid. Now, Alice only knows the length of cuboid's longest edge is n, and doesn't know the length of other edges. Suppose the L is the length of shortest path of a cuboid. Alice wants to compute the sum of L2 for every possible cuboid.
Input
The first line of input contains an integer T(T ≤ 100) . T is the number of the cases. In the following T lines, there are a positive integer n(1≤n≤1014) in each line. n is the longest edge of the cuboid.
Output
For each test case, output the sum of L2 for every possible cuboid in a line. L is the length of shortest path of a cuboid. It may be very large, so you must output the answer modulo 1000000007.
Sample Input
2
3
4
Sample Output
160
440
Hint
(3,2,1) and (3,1,2) are regrad as the same cuboids.
Author: MU, Tongzhou
题意:就是说给出长方体的长(最长边),问一个蚂蚁从左下角爬到右后上角的所有可能的最短距离的和
解法:
1、听说有人用矩阵乘法过了,蛮厉害的,至今不知怎么推递推式
2、只能傻傻的推公示
显然一个蚂蚁有两种方式到达右后上角
设长为n,令两边为a,b,路程为c
c^2 = n^2+(a+b)^2 = n^2+a^2+b^2+2*a*b
或 c^2 = (n+a)^2+b^2 = n^2+a^2+b^2+2*a*n
显然是上面那个比较小
然后现有如下公式
A = 1+2+3+...+n = (n+1)*n/2
B = 1^2+2^2+3^2+.....+n^2 = n(n+1)(2n+1)/6
C = 1^3+2^3+3^3+......+n^3 = (n*(n+1)/2)^2
然后因为(n,a,b)跟(n,b,a)一样
不妨令a<b
那么(a,b)共有n*(n-1)/2种方式
所以 那个 n^2 总共的和为 n^2*n*(n-1)/2 = n^2*A
观察每种a^2、b^2被加的次数,发现
a^2 的总共的和为 1^2*n+2^2*(n-1)+......+n^2*1 = sigma(1<=i<=n) i^2*(n-i+1) = sigma(1<=i<=n) (n+1)*i^2-i^3
= (n+1)*(1^2+2^2+3^2+.....+n^2)-(1^3+2^3+3^3+....+n^3)
= (n+1)*n(n+1)(2n+1)/6- (n*(n+1)/2)^2 = (n+1)*B-C
b^2 的总共的和为 1^2*1+2^2*2+.....+n^2*n = (n*(n+1)/2)^2 = C
所以a^2+b^2= (n+1)*n(n+1)(2n+1)/6 = (n+1)*B
再观察2*a*b
就是 2*sigma(1<=i<=n) i*(i+(i+1)+.....+n)
= 2*sigma(1<=i<=n) i*(n+i)*(n-i+1)/2
= sigma(1<=i<=n) i*(n^2-i^2+n+1)
= sigma(1<=i<=n) n^2*i-i^3+n*i+i
= n^2*A-C+n*A+A
三者相加即可
(公式有可能打错,但思路没错,具体请看代码)
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <deque>
#include <queue>
using namespace std;
typedef long long LL;
typedef double DB;
#define Rep(i, n) for(int i = (0); i < (n); i++)
#define Repn(i, n) for(int i = (n)-1; i >= 0; i--)
#define For(i, s, t) for(int i = (s); i <= (t); i++)
#define Ford(i, t, s) for(int i = (t); i >= (s); i--)
#define rep(i, s, t) for(int i = (s); i < (t); i++)
#define repn(i, s, t) for(int i = (s)-1; i >= (t); i--)
#define MIT (2147483647)
#define MLL (1000000000000000000LL)
#define INF (1000000001)
#define mk make_pair
#define ft first
#define sd second
#define clr(x, y) (memset(x, y, sizeof(x)))
#define sqr(x) ((x)*(x))
#define sz(x) ((int) (x).size())
#define puf push_front
#define pub push_back
#define pof pop_front
#define pob pop_back
inline void SetIO(string Name) {
string Input = Name+".in", Output = Name+".out";
freopen(Input.c_str(), "r", stdin);
freopen(Output.c_str(), "w", stdout);
} const LL Mod = 1000000007LL;
const int Max = ;
LL n; inline LL GetLL() {
LL Ret = ;
char Ch = ' ';
while(!(Ch >= '' && Ch <= '')) Ch = getchar();
while(Ch >= '' && Ch <= '') {
Ret = Ret*10LL+Ch-'';
Ch = getchar();
}
return Ret;
} inline void Solve(); inline void Input() {
int TestNumber;
scanf("%d", &TestNumber);
while(TestNumber--) {
n = GetLL();
Solve();
}
} inline void Work(LL &m, bool &F2, bool &F3) {
if(!F2 && m% == ) F2 = , m /= ;
if(!F3 && m% == ) F3 = , m /= ;
m %= Mod;
} inline void Solve() {
LL X, Y, Z;
LL A, B, C;
LL m;
bool F2 = , F3 = ; // Get X
F2 = , F3 = , X = ;
m = n;
Work(m, F2, F3);
X = (X*m)%Mod; m = (n+);
Work(m, F2, F3);
X = (X*m)%Mod; m = (*n+);
Work(m, F2, F3);
X = (X*m)%Mod; // Get Y
F2 = , F3 = , Y = ;
m = n;
Work(m, F2, F3);
Y = (Y*m)%Mod; m = n+;
Work(m, F2, F3);
Y = (Y*m)%Mod; Y = (Y*Y)%Mod; // Get Z
F2 = , F3 = , Z = ;
m = n;
Work(m, F2, F3);
Z = (Z*m)%Mod; m = n+;
Work(m, F2, F3);
Z = (Z*m)%Mod; m = n%Mod;
// Get A
A = Z;
A = (A*m)%Mod;
A = (A*m)%Mod; // Get B
B = X;
B = (B*(m+))%Mod; // Get C
C = (((m*m)%Mod)*Z)%Mod;
C = (C-Y+Mod)%Mod;
C = (C+X)%Mod;
C = (C+((m*Z)%Mod))%Mod; LL Ans = (A+B+C)%Mod;
cout<<Ans<<endl;
} int main() {
Input();
//Solve();
return ;
}
ZOJ 3903 Ant ZOJ Monthly, October 2015 - A的更多相关文章
- ZOJ 3913 Bob wants to pour water ZOJ Monthly, October 2015 - H
Bob wants to pour water Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge There i ...
- ZOJ 3911 Prime Query ZOJ Monthly, October 2015 - I
Prime Query Time Limit: 1 Second Memory Limit: 196608 KB You are given a simple task. Given a s ...
- ZOJ 3910 Market ZOJ Monthly, October 2015 - H
Market Time Limit: 2 Seconds Memory Limit: 65536 KB There's a fruit market in Byteland. The sal ...
- ZOJ 3908 Number Game ZOJ Monthly, October 2015 - F
Number Game Time Limit: 2 Seconds Memory Limit: 65536 KB The bored Bob is playing a number game ...
- ZOJ 3905 Cake ZOJ Monthly, October 2015 - C
Cake Time Limit: 4 Seconds Memory Limit: 65536 KB Alice and Bob like eating cake very much. One ...
- 143 - ZOJ Monthly, October 2015 I Prime Query 线段树
Prime Query Time Limit: 1 Second Memory Limit: 196608 KB You are given a simple task. Given a s ...
- ZOJ 3903 Ant(数学,推公示+乘法逆元)
Ant Time Limit: 1 Second Memory Limit: 32768 KB There is an ant named Alice. Alice likes going ...
- ZOJ 3903 Ant(公式推导)
这个公式推导过程是看的这位大牛的http://blog.csdn.net/bigbigship/article/details/49123643 扩展欧几里德求模的逆元方法: #include < ...
- 思维+multiset ZOJ Monthly, July 2015 - H Twelves Monkeys
题目传送门 /* 题意:n个时刻点,m次时光穿梭,告诉的起点和终点,q次询问,每次询问t时刻t之前有多少时刻点是可以通过两种不同的路径到达 思维:对于当前p时间,从现在到未来穿越到过去的是有效的值,排 ...
随机推荐
- 淘宝(阿里百川)手机客户端开发日记第三篇 SlidingPaneLayout实现侧滑菜单
需要的三个布局文件: activity_main.xml :主窗体布局 left.xml : 左侧栏目分类布局 right.xml : 右侧内容详情 需要的组件: android.support.v4 ...
- 数据库多张表导出到excel
数据库多张表导出到excel public static void export() throws Exception{ //声明需要导出的数据库 String dbName = "hdcl ...
- 电够动力足——认识主板上的CPU供电模块
CPU供电模块有啥用 CPU供电模块从字面上理解,就是专给CPU供电的一个电子元器件组合.因为CPU工作时就跟发动机一样,油(电)提供得稳不稳定.品质高不高就是CPU供电模块干的事情.反过来说,如果C ...
- 基于DCMTK的DICOM相关程序编写攻略
2008年09月10日 星期三 15:35 基于DCMTK的DICOM相关程序编写攻略 前言: 由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,在我们进行医学图像处理的过程中,经常 ...
- Linux rpm安装问题解决
1.安装时提示:warning: *.rpm: Header V3 RSA/SHA256 Signature, keykey ID c105b9de: NOKEY 解决的方法就是在rpm 语句后面加上 ...
- 二级域名session 共享方案
二级域名session 共享方案 1.利用COOKIE存放session_id(); 实例: 域名一文件php代码: <?php session_start(); setcookie(&qu ...
- sharepoint读取启用了追加功能的多行文本的历史版本记录
当建立多行文本栏时,有个功能就是"追加对现有文本所做的更改",这个功能启用后,这个多行文本就只运行追加内容而不允许修改以前提交的内容.常常被应用在多个用户之间的协作.问题的追踪等记 ...
- Eclipse 一直提示 loading descriptor for 的解决方法(转)
启动eclipse之后,进行相关操作时,弹出界面,提示:loading descriptor for xxx 解决方法: 在Eclipse左侧的Project Explorer 最右上角有一个小钮,鼠 ...
- 安装完mysql后用root不能su成mysql
现象: debian的机器用aptitude install mysql-server-5.1 后,用id mysql 可看出已经建了mysql用户,但是用root来su mysql 不成功,/var ...
- 搭建CAS单点登录服务器
最近公司的一个项目需要用到单点登录的功能,之前对单点登录了解得不多.于是网上找了下单点登录的解决方案,发现CAS是个不错的解决方案.于是搭个环境测试了一下.这里记录下测试的详细步骤. 官网:http: ...