国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

bzoj 2956: 模積和 (數論+乘法逆元)

2019-11-08 03:27:43
字體:
來源:轉載
供稿:網友

2956: 模積和

Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1276  Solved: 574[Submit][Status][Discuss]

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。

HINT

Source

中國國家隊清華集訓 2012-2013 第一天

[Submit][Status][Discuss]

題解:數論+乘法逆元

剛開始沒看到i!=j 這個條件,所以直接將式子化成了sigma(i=1..n)(n mod i)*sigma(i=1..m)(m mod i)

就可以把兩部分分開計算,那么這道題就變成了CQOI余數之和

sigma (i=1..n) n mod i

=sigma(i=1..n) n-(floor(n/i)*i)

因為floor(n/i)的取值是一段一段的,所以可以在O(sqrt(n))的時間內出解。

然后我們考慮從答案中除去不符合條件的,即sigma(i=1..min(n,m) (n mod i)*(m mod i)

=sigma(i=1..min(n,m))(n-floor(n/i)*i)*(m-floor(m/i)*i)

=sigma(i=1..min(n,m))n*m-m*floor(n/i)*i-n*floor(m/i)*i-floor(n/i)*floor(m/i)*i*i

可以在O(sqrt(n)+sqrt(m))的時間內出解

需要用到平方和公式sum=n*(n+1)*(2n+1)/6

#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<cstdio>#define p 19940417#define LL long longusing namespace std;LL n,m,inv1;LL quickpow(LL num,int x)  {      LL base=num%p; LL ans=1;      while (x) {          if (x&1) ans=ans*base%p;          x>>=1;          base=base*base%p;      }      return ans;  }  LL calc(LL n,LL k){	LL i,j; LL ans=0;	for (i=1,j=0;i<=k;i=j+1) {		if (n/i!=0) j=min(n/(n/i),k);		else j=k;		ans+=((j-i+1)*(i+j)/2)%p*(n/i)%p;		ans%=p;	}	return ans;}void exgcd(LL a,LL b,LL &x,LL &y)    {        if (!b) {            x=1; y=0; return;        }        exgcd(b,a%b,x,y);        LL t=y;        y=x-(a/b)*y;        x=t;    }    LL inv(LL a,LL b)    {        LL x,y;        exgcd(a,b,x,y);        return x;    }    LL sum(LL n1){    return (LL)n1*(n1+1)%p*(2*n1+1)%p*inv1%p;    //return n1*(n1+1)*(2*n1+1)/6;}LL calc1(LL k){	LL i,j; LL ans=n*m%p*k%p;	for (i=1,j=0;i<=k;i=j+1) {		j=min(n/(n/i),m/(m/i));		j=min(j,k);		LL t=m*(n/i)+n*(m/i); t=(t%p+p)%p;		t=((j-i+1)*(i+j)/2)%p*t;		LL t1=sum(j)-sum(i-1); t1=(t1%p+p)%p;		ans=ans+((n/i)*(m/i)%p*t1%p-t+p)%p;		ans=(ans%p+p)%p;	}	return ans;}int main(){	freopen("a.in","r",stdin);	freopen("my.out","w",stdout);	scanf("%d%d",&n,&m);	inv1=inv(6,p);	LL t1=calc(n,n); t1=((LL)n*n-t1)%p;	LL t2=calc(m,m); t2=((LL)m*m-t2)%p;	LL t3=calc1(min(n,m));	//cout<<t1*t2%p<<" "<<t3<<endl;	LL ans=t1*t2%p-t3; ans=(ans%p+p)%p;	PRintf("%I64d/n",ans);}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 昌平区| 扬州市| 甘孜县| 黄浦区| 武胜县| 高邮市| 江津市| 呼和浩特市| 宁陵县| 汉阴县| 营山县| 兴文县| 乐安县| 平昌县| 万宁市| 博爱县| 台湾省| 景德镇市| 丹棱县| 仁化县| 哈尔滨市| 南澳县| 沂南县| 琼结县| 丰镇市| 安平县| 平江县| 九龙县| 东海县| 开鲁县| 临猗县| 农安县| 东至县| 深州市| 赤峰市| 桃园县| 玛沁县| 青浦区| 远安县| 汶川县| 金堂县|