三角形
有一个等边三角形,在每条边上等距离画n个点,(顶点上不画,把每条边分成n+1段),在这3n个点中选取3个点作为新三角形的顶点,求所有不同三角形的面积和。
3n个点有各自的编号,两个三角形不同当且仅当选取编号集合不同,规定单位面积为边长每一段长度的等边三角形面积。
答案对1e9+7取模
1<=n<=1e9
题解
很容易分出两类:有两个点在同一边上,三点都在不同边。
1.记有两个点的边为底边。可以得到
$2*3\sum_{x=1}^{n-1}x(n-x)*\sum_{h=1}^{n}h$(顶点可以在两边选取,底边有三种
$3n(n+1)(n\sum_{x=1}^{n-1}x-\sum_{x=1}^{n-1}x^{2})$
$\frac{n^{2}(n+1)(n^{2}-1)}{2}$
2.在三边分别选边,记a,b,c为三点到所在边的左端点的距离
$\sum_{a=1}^{n}\sum_{b=1}^{n}\sum_{c=1}^{n}(n+1)^{2}-(n+1-a)b-(n+1-b)c-(n+1-c)a$
$\sum_{a=1}^{n}\sum_{b=1}^{n}\sum_{c=1}^{n}(n+1)^{2}-(n+1)(a+b+c)+ab+ac+bc$
$(n+1)^{2}$与a,b,c无关,所以可以算得贡献为$n^{3}(n+1){2}$
对于(a+b+c)可以考虑画出树形图,发现c从1-n的取值重复了$n^{2}$次,所以贡献为$\frac{n^{3}(n+1)^{2}}{2}$,a,b,c并无本质区别,所以a+b+c的贡献为$\frac{3n^{3}(n+1)^{2}}{2}$
对于后面剩下的部分只看$(a+b)c$
$(\sum_{a=1}^{n}\sum_{b=1}^{n}(a+b))*\sum_{c=1}^{n}c$
$\frac{n^{3}(n+1)^{2}}{2}$
对于$ab$可以用$\sum_{c=1}^{n}(\sum_{a=1}^{n}a*\sum_{b=1}^{n}b)$计算或者可以根据a,b,c无本质区别直接对刚才的$(a+b)c$*3/2即可
最后合并就是$\frac{n^{2}(n+1)(n^{2}-1)}{2}+\frac{n^{3}(n+1)^{2}}{4}$
#include<cstdio> #include<iostream> #include<algorithm> #define ll long long using namespace std; const int mod=1000000007; const ll inv2=500000004; const ll inv4=250000002; ll n; ll ret=0,ans; int main(){ freopen("triangle.in","r",stdin); freopen("triangle.out","w",stdout); scanf("%lld",&n); ans=n*n%mod*(n+1)%mod*(n*n%mod-1)%mod*inv2%mod;//有两个点在一条边 ans=(ans+n*n%mod*n%mod*(n+1)%mod*(n+1)%mod*inv4%mod)%mod; printf("%lld",(ans%mod+mod)%mod); }
速度限制
题解
考虑到v很小而且通过道路时间和速度有关,所以直接把dis多开一维记录到达i点速度为j的时候的最小时间。
在最短路时,记录标点号和速度即可。可以看做分层图(按速度分层)。