XTU 1274 Matrix(逆元,推公式)

矩阵

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 
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<'\n';
    }
    return 0;
}
//1360k 46ms

转载请注明出处^ ^

你可能感兴趣的:(XTU—程序设计实践网站)