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时间,从现在到未来穿越到过去的是有效的值,排 ...
随机推荐
- 滑动菜单栏(一)开源项目SlidingMenu的使用
本帖最后由 user1 于 2013-7-16 21:56 编辑 一.SlidingMenu简介相信大家对SlidingMenu都不陌生了,它是一种比较新的设置界面或配置界面的效果,在主界面左滑或者右 ...
- 使用nginx lua实现网站统计中的数据收集
导读网站数据统计分析工具是各网站站长和运营人员经常使用的一种工具,常用的有 谷歌分析.百度统计和腾讯分析等等.所有这些统计分析工具的第一步都是网站访问数据的收集.目前主流的数据收集方式基本都是基于ja ...
- iphone数据存储之-- Core Data的使用(一)
http://www.cnblogs.com/xiaodao/archive/2012/10/08/2715477.html 一.概念 1.Core Data 是数据持久化存储的最佳方式 2.数据最终 ...
- hiho #1272 买零食 [Offer收割]编程练习赛2
#1272 : 买零食 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho很喜欢在课间去小卖部买零食.然而不幸的是,这个学期他又有在一教的课,而一教的小卖部姐姐以冷若冰 ...
- 配置oss bucket cors
到bucket中属性中选择跨越设置,点击添加规则会看到以下界面: 对应的输入如上即可.
- Python中请使用isinstance()判断变量类型
一.isinstance() 在Python中可以使用type()与isinstance()这两个函数判断对象类型,而isinstance()函数的使用上比type更加方便. # coding=utf ...
- css整个页面离顶部的距离
body { padding:0; margin:0; font-size:12px; line-height:22px; } 说明: 整个页面离顶部的距离是22像素
- 惊魂web应用宕机记一次网站的紧急恢复
这次网站的故障出现的比较突然,没有任何防备,有种突如其来的感觉.这是一台阿里云服务器,采用wdcp的nginx+apache+mysql的方式运行.一位同事在对web目录进行压缩后,由于web目录有很 ...
- Java for LeetCode 162 Find Peak Element
A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...
- 2.前端笔记之css
title: 1.前端笔记之CSS date: 2016-04-05 23:05:51 tags: 前端 categories: w3c --- 作者:刘耀 **出处:http://www.liuya ...