矩阵
链接
题目描述
我们把1∼N2按下面矩阵的规律进行排列:
145161736⋯236151835987141934101112132033252423222132262728293031
请求第一列的累加和。
输入
每行一个整数N(1≤N≤109),如果N=0表示输入结束,这个样例不需要处理。
输出
每行输出一个样例的结果,因为这个值可能很大,请将其对1,000,000,007取模。
样例输入
1
2
3
1000000000
0
样例输出
1
5
10
499999881
思路:
我们可以看到最左一列,偶数行的值为4、16、36,容易联想到2²,4²,6²;
而奇数行的值为1,5,17,容易联想到0²+1,2²+1,4²+1;
由此不难推出输入x时得到的值的关系。
该题坑点在于,若不提前对mod取模,会爆LL,解决方法是求逆元(当然也可以用大数)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
#include <bits/stdc++.h> using namespace std; #define ll __int64 const ll mod = 1e9+7; ll qmod(ll x, ll p)//快速幂求逆元 { ll ans = 1; while(p) { if(p%2) ans = ans*x%mod; x = x*x%mod; p /= 2; } return ans; } int main() { ll a; ll e = 500000004; ll s = 333333336; while(scanf("%I64d",&a)!=EOF&&a) { ll ans = a*(a+1)%mod*e%mod*(2*a+1)%mod*s%mod; ans -= (4 + (a-1)*2)*(a-1)/4; if(a%2==0) ans+=(a-1); while(ans<0) ans = (ans+mod)%mod; cout<<ans<<'n'; } return 0; } //1360k 46ms
|
转载请注明出处^ ^
近期评论