XTU 1274 Matrix(逆元,推公式)

这篇博客探讨了XTU 1274 Matrix问题,涉及矩阵中第一列元素的累加和规律。通过观察发现偶数行的值与平方数相关,奇数行的值与平方数加1有关。作者指出在处理大数时需注意取模运算,并提到了逆元在解决此类问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

矩阵

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

转载请注明出处^ ^

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值