矩阵
http://202.197.224.59/exam/index.php/problem/read/id/1274
题目描述
我们把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,解决方法是求逆元(当然也可以用大数)。
#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
转载请注明出处^ ^