• BZOJ 2956 模积和


    Description

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

    Input

    第一行两个数n,m。

    Output

      一个整数表示答案mod 19940417的值

    Sample Input

    3 4

    Sample Output

    1

    样例说明
      答案为(3 mod 1)*(4 mod 2)+(3 mod 1) * (4 mod 3)+(3 mod 1) * (4 mod 4) + (3 mod 2) * (4 mod 1) + (3 mod 2) * (4 mod 3) + (3 mod 2) * (4 mod 4) + (3 mod 3) * (4 mod 1) + (3 mod 3) * (4 mod 2) + (3 mod 3) * (4 mod 4) = 1

    数据规模和约定
      对于100%的数据n,m<=10^9。

    原式=∑∑(n-[n/i]*i)(m-[m/j]*j)

    =∑∑nm-[n/i]*i*m-[m/j]*j*n+[n/i]*[m/j]*i*j

    =n*n*m*m-m*m∑[n/i]*i-n*n∑[m/j]*j+∑[n/i]*i∑[m/j]*j

    发现很多n/i的值是相同的,把相同的n/i分在一块算,这样只有√n块

    因为i!=j

    所以ans要减去∑(n-[n/i]*i)(m-[m/i]*i)

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 typedef long long lol;
     8 lol n,m,pos,ans,ans1,ans2,ans3,ans4,ans5,ans6,ans7,Mod=19940417;
     9 lol inv=3323403;
    10 lol cal1(lol y,lol x)
    11 {
    12   return ((y+x)*(y-x+1)/2)%Mod;
    13 }
    14 lol cal2(lol y,lol x)
    15 {x--;
    16   lol zyys1=(2*y+1)*(y+1)%Mod*y%Mod*inv%Mod;
    17   lol zyys2=(2*x+1)*(x+1)%Mod*x%Mod*inv%Mod;
    18   return (zyys1-zyys2+Mod)%Mod;
    19 }
    20 int main()
    21 {lol i;
    22   cin>>n>>m;
    23   if (n>m) swap(n,m);
    24   ans=n*m%Mod;
    25   ans=(ans*ans)%Mod;
    26   pos=0;ans1=0;
    27   for (i=1;i<=n;i=pos+1)
    28     {
    29       pos=n/(n/i);
    30       ans1+=cal1(pos,i)*(n/i)%Mod;
    31       ans1%=Mod;
    32     }
    33   ans3=ans1;
    34   ans1=(ans1*m)%Mod;ans1=(ans1*m)%Mod;
    35     pos=0;ans2=0;
    36   for (i=1;i<=m;i=pos+1)
    37     {
    38       pos=m/(m/i);
    39       ans2+=cal1(pos,i)*(m/i)%Mod;
    40       ans2%=Mod;
    41     }
    42   ans3=(ans3*ans2)%Mod;
    43   ans2=(ans2*n)%Mod;ans2=(ans2*n)%Mod;
    44   ans=(((ans-ans1+Mod)%Mod-ans2+Mod)%Mod+ans3)%Mod;
    45   
    46   pos=0;ans4=0;ans5=0;ans6=0;ans7=0;
    47   for (i=1;i<=n;i=pos+1)
    48     {
    49       pos=min(n/(n/i),m/(m/i));
    50       ans7+=(((n/i)*(m/i))%Mod)*cal2(pos,i)%Mod;ans7%=Mod;
    51       ans5+=(n/i)*m%Mod*cal1(pos,i)%Mod;ans5%=Mod;
    52       ans6+=(m/i)*n%Mod*cal1(pos,i)%Mod;ans6%=Mod;
    53     }
    54   ans4=((n*n%Mod)*m%Mod-ans5+Mod)%Mod;
    55   ans4=(ans4-ans6+Mod)%Mod;
    56   ans4=(ans4+ans7)%Mod;
    57   printf("%lld
    ",(ans-ans4+Mod)%Mod);
    58 }
  • 相关阅读:
    菖蒲河公园-中山公园-天安门广场一日游
    LeetCode 485 Max Consecutive Ones
    LeetCode 766. Toeplitz Matrix
    LeetCode 566 Reshape the Matrix
    LeetCode 561. Array Partition I
    算法学习系列之(1):常用算法设计方法
    纪念2017,展望2018
    Java server数据之(4):Redis鸟瞰
    《机器学习》读书笔记-第一章 引言
    node.js实践第二天
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/8298329.html
Copyright © 2020-2023  润新知