嘘~ 正在从服务器偷取页面 . . .

洛谷P2260 [清华集训2012]模积和 题解


洛谷P2260 [清华集训2012]模积和 题解

题目链接:P2260 [清华集训2012]模积和

题意

给定 $n,m$ ,求

数据范围

$1 \le n,m \le 10^9$

根据容斥原理

然后推推柿子

有一个小的公式,这里就不证明了(逃

然后到这里就没啥难度了

考虑数论分块

时间复杂度 $\mathcal{O}(\sqrt{n})$

代码如下

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int p=19940417;
const int inv2=9970209;
const int inv6=3323403;
#define sum1(x) ((x)%p*(x+1)%p*inv2%p)
#define sum2(x) ((x)%p*(x+1)%p*(2*(x)%p+1)%p*inv6%p)
int solve(int x)
{
    int res=x%p*x%p;
    for(int l=1,r; l<=x; l=r+1)
    {
        r=x/(x/l);
        res=(res-(sum1(r)-sum1(l-1))%p*(x/l)%p)%p;
    }
    return res;
}
int n,m,a,b,c,ans;
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin >> n >> m;
    if(n>m)swap(n,m);
    ans=(solve(n)*solve(m)%p-n%p*n%p*m%p)%p;
    for(int l=1,r; l<=n; l=r+1)
    {
        r=min(n/(n/l),m/(m/l));
        a=(a+(sum1(r)-sum1(l-1))%p*m%p*(n/l)%p)%p;
        b=(b+(sum1(r)-sum1(l-1))%p*n%p*(m/l)%p)%p;
        c=(c+(sum2(r)-sum2(l-1))%p*(n/l)%p*(m/l)%p)%p;
    }ans=((ans+a+b-c)%p+p)%p;
    cout << ans << endl;
    return 0;
}

参考文献

[1] https://www.luogu.com.cn/blog/xiaoziyaoxzy/solution-p2260


文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录