zoukankan      html  css  js  c++  java
  • BZOJ 2956 模积和(分块)

    【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2956

    【题目大意】

      求∑∑((n%i)*(m%j))其中1<=i<=n,1<=j<=m,i≠j。

    【题解】

       $∑_{i=1}^{n}∑_{j=1}^{m}((nmod i)*(mmod j))(i≠j)$
      $=∑_{i=1}^{n}∑_{j=1}^{m}(n-lfloor frac{n}{i} floor*i)*(m-lfloor frac{m}{j} floor*j)-∑_{i=1}^{min(n,m)}(n-lfloor frac{n}{i} floor*i)*(m-lfloor frac{m}{i} floor*i)$
      $=∑_{i=1}^{n}(n-lfloor frac{n}{i} floor)*∑_{i=1}^{m}(m-lfloor frac{m}{i} floor)$
      $-∑_{i=1}^{min(n,m)}n*m-n*lfloor frac{m}{i} floor*i-m*lfloor frac{n}{i} floor*i+lfloor frac{n}{i} floorlfloor frac{m}{i} floor*i^2$

      我们对于n/i分段统计即可。

    【代码】

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    typedef long long LL;
    const LL inv6=3323403;
    const LL mod=19940417;
    LL n,m,ans;
    LL sum(LL a,LL b){return (b-a+1)*(a+b)/2%mod;}
    LL sum2(LL x){return x*(x+1)%mod*(2*x+1)%mod*inv6%mod;}
    LL cal(LL n){
        LL res=0;
        for(LL l=1,r;l<=n;l=r+1){
            r=n/(n/l);
            res=(res+n*(r-l+1)%mod-sum(l,r)*(n/l))%mod;
        }return (res+mod)%mod;
    }
    int main(){
        while(~scanf("%lld%lld",&n,&m)){
            ans=cal(n)*cal(m)%mod;
            if(n>m)swap(n,m);
            for(int l=1,r;l<=n;l=r+1){
                r=min(n/(n/l),m/(m/l));
                LL s1=n*m%mod*(r-l+1)%mod;
                LL s2=(n/l)*(m/l)%mod*(sum2(r)-sum2(l-1)+mod)%mod;
                LL s3=(n/l*m+m/l*n)%mod*sum(l,r)%mod;
                ans=(ans-(s1+s2-s3)%mod+mod)%mod;
            }printf("%lld
    ",ans);
        }return 0;
    }
    

      

  • 相关阅读:
    【DNN发布包解释】package 包裹
    数据仓库 SSIS
    【DNN 系列】 添加模块后不显示
    GridView 绑定 ObjectDataSource
    【DNN 系列】 MVC 分页
    关于一级指针和二级指针的简单见解
    高效使用Vector
    关于autoptr
    (转)Win10 + VMware-CentOS7文件共享、网络连接
    Linux 笔记
  • 原文地址:https://www.cnblogs.com/forever97/p/bzoj2956.html
Copyright © 2011-2022 走看看