2956: 模积和 乘法逆元 取模

本文解析了一道BZOJ题目,并提供了一份详细的代码实现。通过使用longlong类型避免了数据处理中的类型转换问题,针对不同的计算需求,设计了多个辅助函数进行模块化处理,有效解决了大数据场景下的计算难题。

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

建议直接开long long,否则各种强制转换类型可能会出问题。。我因为这调了好久,小数据拍的飞起大数据各种跪。。
公式见hzwer
bzoj题目描述坑。。其实还是挺简单的,分开计算就好了。。

#include<iostream>
#include<cstdio>
#define ll long long
#define p 19940417
#define ine2 9970209
#define ine6 3323403
using namespace std;
ll n,m;
ll calc(ll k,ll n)
{
    ll tmp=0;
    for (ll i=1,pos=0;i<=k;i=pos+1)
    {
        pos=min(n/(n/i),k);
        (tmp+=(n/i)%p*(((pos+1)*(pos)%p*ine2%p-(i-1)*i%p*ine2%p+p)%p)%p)%=p;
    }
    return (tmp+p)%p;
}
ll calc0(ll n,ll m)
{
    ll tmp=0;
    for (ll i=1,pos=0;i<=n;i=pos+1)
    {
        pos=min(n/(n/i),m/(m/i));
        (tmp+=(n/i)*(m/i)%p*((pos*(pos+1)%p*(pos*2+1)%p*ine6%p-(i-1)*i%p*(i*2-1)%p*ine6%p+p)%p)%p)%=p;
    }
    return (tmp+p)%p;
}
int main()
{
    scanf("%lld%lld",&n,&m);
    if (n>m) swap(n,m);
    ll t1=calc(n,n),t2=calc(m,m),t3=calc(n,m),t4=calc0(n,m);
    ll ans=((((ll)n*n%p-t1+p)%p)*(((ll)m*m%p-t2+p)%p)%p-((ll)n*n%p*m%p-(ll)t1*m%p-(ll)t3*n%p+t4%p+p*10)%p+p)%p;
    cout << ans << endl;
    return 0;
}
### 关于 AcWing 平台上快速幂求逆元算法实现 #### 快速幂求逆元简介 在意义下计算乘法逆元是一个常见的需求,在许多竞赛编程题目中都会遇到。对于给定的整数 \( a \),如果存在一个整数 \( b \) 使得 \( ab ≡ 1 (\mod p)\),那么 \( b \) 就被称为 \( a \) 的 \( p \) 下的乘法逆元。 利用费马小定理可以简化这一过程,即当 \( p \) 是质数时,\( a^{p−1}≡1(\mod p) \)[^1]。因此可以通过快速幂来高效地找到这个逆元,时间复杂度为 O(log n)[^3]。 #### Python 实现代码示例 下面展示如何通过Python编写函数`quick_pow_mod(a, k, m)`来进行快速幂运算,并基于此构建求解逆元的功能: ```python def quick_pow_mod(a, k, mod): res = 1 % mod while k: if k & 1 == 1: res = res * a % mod k >>= 1 a = a * a % mod return res def inv_mod(num, prime): """返回num关于prime下的逆元""" return quick_pow_mod(num, prime - 2, prime) if __name__ == "__main__": num = int(input()) prime = int(input()) print(inv_mod(num, prime)) ``` 这段代码首先定义了一个用于执行快速幂操作的方法 `quick_pow_mod()` ,接着创建了另一个方法 `inv_mod()` 来调用前者并传入参数 `(num, prime-2, prime)` 计算所需的逆元[^2]。 #### 应用场景举例 考虑这样一个具体的应用案例:假设有一个长度为 N 的数组 A[] 一个正整数 P(P>1),现在要找出有多少种不同的子序列满足其所有元素之对P余的结果等于X(X<P) 。这个问题涉及到组合数学中的排列计数技巧以及使用快速幂求逆元优化性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值