码迷,mamicode.com
首页 > 其他好文 > 详细

P2260 [清华集训2012]模积和

时间:2018-06-19 22:47:03      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:its   const   limits   描述   fine   div   求和   cout   \n   

题目背景

数学题,无背景。

题目描述

$\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} (n \bmod i) \times (m \bmod j), i \neq j \;\bmod\;19940417$ 的值

输入输出格式

输入格式:

 

两个整数n m

 

输出格式:

 

答案 mod 19940417

 

输入输出样例

输入样例#1: 
3 4
输出样例#1: 
1
输入样例#2: 
123456 654321
输出样例#2: 
116430

说明

30%: n,m <= 1000

60%: n,m <= 10^6

100% n,m <= 10^9

 

Solution:

   本题实在是太贼有意思了。。。

  开始没有发现条件$i\neq j$,结果一直以为取模错误,搞了半天。

  首先,我们先忽略$i\neq j$的条件,直接求$\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} (n \bmod i) \times (m \bmod j)$。

  对原式化简:原式$=\sum\limits_{i=1}^{n}{(n-i\times\lfloor{n/i}\rfloor)\sum\limits_{j=1}^{m}{(m-j\times\lfloor{m/j}\rfloor)}}=(n^2-\sum\limits_{i=1}^{n}{(i\times\lfloor{n/i}\rfloor))(m^2-\sum\limits_{j=1}^{m}{(j\times\lfloor{m/j}\rfloor)})}$,然后对这个式子两边各自一遍数列分块套上等差数列求和,求出$ans$值并取模。

  由于多算了$i==j$的情况,所以我们还要从$ans$中减去$i==j$的情况。

  对于$i==j$的情况累加的值$tot$,容易得出$tot=\sum\limits_{i=1}^{min(n,m)}{(n-i\times\lfloor{n/i}\rfloor)\times(m-j\times\lfloor{m/i}\rfloor)}$

代码:

 1 #include<bits/stdc++.h>
 2 #define il inline
 3 #define ll long long
 4 #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
 5 #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
 6 #define Max(a,b) ((a)>(b)?(a):(b))
 7 #define Min(a,b) ((a)>(b)?(b):(a))
 8 using namespace std;
 9 const int mod = 19940417 , phi = 3323403;
10 ll n,m;
11 
12 il ll solve(ll x){
13     ll ans=(x%mod*x%mod)%mod,p,c;
14     for(ll i=1;i<=x;i=p+1){
15         p=x/(x/i);
16         ans=(ans-(p+i)*(p-i+1)/2%mod*(x/i)%mod+mod)%mod;
17     }
18     return ans;
19 }
20 
21 il ll get(ll x){return x*(x+1)%mod*(x<<1|1)%mod*phi%mod;}
22 
23 int main(){
24     ios::sync_with_stdio(0);
25     cin>>n>>m;
26     ll p,sum1,sum2,sum3,ans=solve(n)*solve(m)%mod;
27     if(n>m)swap(n,m);
28     for(ll i=1;i<=n;i=p+1){
29         p=Min(n/(n/i),m/(m/i));
30         sum1=(m*n%mod*(p-i+1))%mod;
31         sum2=(n/i)*(m/i)%mod*(get(p)-get(i-1)+mod)%mod;
32         sum3=(p-i+1)*(p+i)/2%mod*(n/i*m%mod+m/i*n%mod);
33         ans=(ans-(sum1+sum2-sum3)%mod+mod)%mod;
34     }
35     cout<<ans%mod;
36     return 0;
37 }

 

P2260 [清华集训2012]模积和

标签:its   const   limits   描述   fine   div   求和   cout   \n   

原文地址:https://www.cnblogs.com/five20/p/9201162.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!