• BZOJ2956: 模积和


    $n<=1e9$,$m<=1e9$,求$sum_{i=1}^{n}sum_{j=1}^{m}[i eq j](n mod i)(m mod j)$。mod 19940417。

    好家伙,拆他!先不理$[i eq j]$。

    $sum_{i=1}^{n}sum_{j=1}^{m}[i eq j](n mod i)(m mod j)$

    $=sum_{i=1}^{n}sum_{j=1}^m(n-left lfloor frac{n}{i} ight floor*i)(m-left lfloor frac{m}{j} ight floor*j)$

    $=sum_{i=1}^{n}sum_{j=1}^m(nm-n*left lfloor frac{m}{j} ight floor*j-m*left lfloor frac{n}{i} ight floor+left lfloor frac{m}{j} ight floor*j*left lfloor frac{n}{i} ight floor*i)$

    分成四部分,分别叫ABCD。

    $A=n^2m^2$

    $B=m^2sum_{i=1}^{n}left lfloor frac{n}{i} ight floor*i$

    $C=n^2sum_{i=1}^{m}left lfloor frac{m}{i} ight floor*i$

    BC可以根号求,把根号求得那些东西分别叫$EF$,即$B=m^2E$,$C=n^2F$。

    $D=sum_{i=1}^{n}sum_{j=1}^{m}left lfloor frac{n}{i} ight floorleft lfloor frac{m}{j} ight floor ij=sum_{i=1}^{n}left lfloor frac{n}{i} ight floor *i sum_{j=1}^{m}left lfloor frac{m}{j} ight floor*j=sum_{i=1}^{n}left lfloor frac{n}{i} ight floor *iF=Fsum_{i=1}^{n}left lfloor frac{n}{i} ight floor *i=EF$

    $i=j$的情况同理我就不写了。。太多了

    注意这个模数不是质数,但2和6的“逆元”要用还是有的,用模数+1再/2或/6即可。

    不知道这模数什么梗。。?

     1 //#include<iostream>
     2 #include<cstring>
     3 #include<cstdlib>
     4 #include<cstdio>
     5 //#include<map>
     6 #include<math.h>
     7 //#include<time.h>
     8 //#include<complex>
     9 #include<algorithm>
    10 using namespace std;
    11 
    12 int n,m;
    13 const int mod=19940417,six=3323403,two=9970209;
    14 
    15 int main()
    16 {
    17     scanf("%d%d",&n,&m); if (n<m) {int t=n; n=m; m=t;}
    18     int A,B,C,D,E,F,G; A=B=C=D=E=F=G=0;
    19     A=1ll*n*n%mod*m%mod*m%mod;
    20     for (int i=1,last;i<=n;i=last+1)
    21     {
    22         last=n/(n/i);
    23         E+=(n/i)*1ll*(i+last)%mod*(last-i+1)%mod*two%mod; E-=E>=mod?mod:0;
    24     }
    25     B=1ll*m*m%mod*E%mod;
    26     for (int i=1,last;i<=m;i=last+1)
    27     {
    28         last=m/(m/i);
    29         F+=(m/i)*1ll*(i+last)%mod*(last-i+1)%mod*two%mod; F-=F>=mod?mod:0;
    30     }
    31     C=1ll*n*n%mod*F%mod;
    32     D=1ll*E*F%mod;
    33     for (int i=1,last,tmp=1ll*n*m%mod;i<=m;i=last+1)
    34     {
    35         last=min(n/(n/i),m/(m/i));
    36         G+=(1ll*tmp*(last-i+1)-1ll*n*(m/i)%mod*(i+last)%mod*(last-i+1)%mod*two%mod
    37         -1ll*m*(n/i)%mod*(i+last)%mod*(last-i+1)%mod*two%mod
    38         +1ll*(n/i)*(m/i)%mod*(1ll*(last)*(last+1)%mod*(last+last+1)%mod-1ll*(i-1)*i%mod*(i+i-1)%mod)%mod*six%mod)%mod;
    39         G=(G%mod+mod)%mod;
    40     }
    41     printf("%lld
    ",(0ll+A-B-C+D-G+mod)%mod);
    42     return 0;
    43 }
    View Code
  • 相关阅读:
    C#获取机器码
    页面延时跳转
    asp.net 删除文件夹,指定文件夹,删除文件夹和所有文件,删除权限设置,递归删除文件夹目录及文件
    c# 关闭程序
    Asp.net网站开发架构设计要求
    ASP.NET页面刷新方法总结
    一个不错的弹出窗口,修改了JS文件可多弹
    c# 实现应用程序重启
    ajax web页面复杂处理延时、客户交互问题
    C# 中关于汉字与16进制转换的代码
  • 原文地址:https://www.cnblogs.com/Blue233333/p/8486071.html
Copyright © 2020-2023  润新知