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) . 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的更多相关文章

  1. 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 ...

  2. 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 ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. ZOJ 3903 Ant(数学,推公示+乘法逆元)

    Ant Time Limit: 1 Second      Memory Limit: 32768 KB There is an ant named Alice. Alice likes going ...

  8. ZOJ 3903 Ant(公式推导)

    这个公式推导过程是看的这位大牛的http://blog.csdn.net/bigbigship/article/details/49123643 扩展欧几里德求模的逆元方法: #include < ...

  9. 思维+multiset ZOJ Monthly, July 2015 - H Twelves Monkeys

    题目传送门 /* 题意:n个时刻点,m次时光穿梭,告诉的起点和终点,q次询问,每次询问t时刻t之前有多少时刻点是可以通过两种不同的路径到达 思维:对于当前p时间,从现在到未来穿越到过去的是有效的值,排 ...

随机推荐

  1. ThinkPHP 分页实现

    TP3.2框架手册,有一个数据分页,不过每次都要写太多的代码,还有中文设置等有些麻烦,做为程序开发者,有必要整理下: O.先看效果图 一.分页方法 /** * TODO 基础分页的相同代码封装,使前台 ...

  2. ajax页面排序的序号问题

    文章是从我的个人博客上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com 目前使用的ajax排序是这样的. 每个table , 都要这样声明 ( table 中必须有2个属性: ...

  3. node.js+websocket实现简易聊天室

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) websocket提供了一种全双工客户端服务器的异步通信方法,这种通信方法使用ws或者wss协议,可 ...

  4. lvs之dr技术的学习与实践

    1.配置测试环境 修改IP windows 200.168.10.4 lvs server  ip:200.168.10.1 因为IP隧道模式只需要一个网卡  所以就停掉其他网卡 web server ...

  5. iOS 关于多线程的一些知识点(不断更新)

    1.NSOperation 对于NSOperation,In OS X v10.6 and later, operation queues ignore the value returned by t ...

  6. Java中泛型在集合框架中的应用

    泛型是Java中的一个重要概念,上一篇文章我们说过,当元素存入集合时,集合会将元素转换为Object类型存储,当取出时也是按照Object取出的,所以用get方法取出时,我们会进行强制类型转换,并且通 ...

  7. mybatis配置文件xml中插入新数据

    初用mybatis,发现很好的一个操作数据库的框架,里面有一些小技巧,挺简单,很实用,记录一下: mybatis的插入语句: <insert id="insertAsset" ...

  8. Linux底下的第一个C程序

    首先保证你的Linux底下安装了GCC,假如没有安装GCC的话请参考: http://www.cnblogs.com/aspirant/p/3544398.html 假如输入 gcc -v 不再是co ...

  9. 【Ubuntu日常技巧】VirtualBox多网卡路由配置,保障虚拟机连接上外网

    [背景]: 配置Ubuntu 虚拟机双网卡,一个是Host-Only网络,一个是桥接网络.当在虚拟机中同时连接到两个网络后,虚拟机能够ping通内部网络,不能ping通外部网络,如www.baidu. ...

  10. Java Hour 59 JVM Heap

    程序没有方法区释放一段Heap 上的内存,只有JVM 本身可以去回收内存,这个工作单位就是GC. Garbage Collection GC 用来清理对象,同时也用来移动对象减少内存碎片. JVM 指 ...