xtu 1274 matrix(逆元,推公式)

矩阵

链接

题目描述

我们把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

转载请注明出处^ ^