计算,取模求调
查看原帖
计算,取模求调
710829
cjZYZtql楼主2022/12/17 19:29

好虐心的一题。

直接开int128了,懒得逆元,求助看哪里计算有误或者没有取模,一个下午除了被USACO薄纱之外就调这题了/kk

//Author: Velvet on Luogu(uid=443675)
#include <bits/stdc++.h>
#define int __int128
using namespace std;

inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
inline void write(int x){if (x < 0) x = ~x + 1, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0');}
inline void writeln(int x){write(x);putchar('\n');}
inline void writesp(int x){write(x);putchar(' ');}
inline int lowbit(int x) {return x&(-x);}
const int mod=19940417;
int calc(int x,int y){
	int rt=0;
	for(int l=1,r;l<=y;l=r+1){
		r=x/(x/l);r=min(r,y);
		rt+=(r-l+1)*(l+r)/2*(x/l);
		rt%=mod;
	}
	return rt;
}
int sum(int n){return n%mod*(n+1)%mod*(2*n+1)%mod;}
signed main(){
	int n=read(),m=read();
	if(m<n) swap(n,m);
	int a=n*n%mod-calc(n,n);
	// for(int i=1;i<=n;i++) a-=i*(n/i)%mod;
	int b=m*m%mod-calc(m,m);
	// for(int i=1;i<=m;i++) b-=i*(m/i)%mod;
	a=(a%mod+mod)%mod;b=(b%mod+mod)%mod;
	int ans=a*b%mod; //前半部分
	
	ans=((ans%mod-n*n%mod*m%mod+n*calc(m,n)%mod+m*calc(n,n)%mod)%mod+mod)%mod;
	for (int l=1,r;l<=n;l=r+1){
    	r=min(n/(n/l),m/(m/l));
   		ans=(ans-(n/l)*(m/l)%mod*(sum(r)-sum(l-1))%mod)%mod;
  	}
	writeln((ans%mod+mod)%mod);
    return 0;
}

2022/12/17 19:29
加载中...