玄学20pts
查看原帖
玄学20pts
175011
rfsfreffr楼主2022/8/15 13:58
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=4e6+5;
const int mod=1e9+7;

int n,q;
int phi[N];
int s[N];
int cnt;
int p[N];
bool vis[N];
int g[N];
int c[N*2];

int poww(int a,int b) {
	int ans=1;
	int sz=a;
	while(b) {
		if(b&1) ans=1ll*ans*sz%mod;
		sz=1ll*sz*sz%mod;
		b>>=1;
	}
	return ans;
}

int lowbit (int x) {return x&(-x);}
void add(int x,int y) {for(;x<=n; x+=lowbit(x)) c[x]=(c[x]+y)%mod;}
int query(int x) {int res=0;for(; x; x-=lowbit(x)) res=(res+c[x])%mod;return res;}

void init() {
	phi[1]=1;
	for(int i=2; i<=n; i++) {
		if(!vis[i]) {
			p[++cnt]=i;
			phi[i]=i-1;
		}
		for(int j=1; j<=cnt&&p[j]*i<=n; j++) {
			int t=p[j]*i;
			vis[t]=1;
			if(i%p[j]==0) {
				phi[t]=phi[i]*p[j];
				break;
			} 
			else phi[t]=phi[i]*(p[j]-1);
		}
	}
	
	for(int i=1; i<=n; i++) 
		s[i]=(s[i-1]+1ll*i*i%mod*phi[i]%mod)%mod;
//	for(int i=n-10; i<=n; i++)
//		cout<<s[i]<<" "<<i<<endl;
	for(int i=1; i<=n; i++) 
		g[i]=1ll*i*i%mod;
	for(int i=1; i<=n; i++)
		add(i,g[i]);
}

void work() {
	while(q--) {
		int a,b,x,k;
		scanf("%lld%lld%lld%lld",&a,&b,&x,&k);
		int d=__gcd(a,b);
		int r=1ll*x*d%mod*d%mod*poww(1ll*a*b%mod,mod-2)%mod;
		add(d,r-g[d]);
		g[d]=r;
		
		int ans=0;
		for(int l=1; l<=k; l=r+1) {
			r=k/(k/l);
			ans=(ans+ 1ll*((query(r)-query(l-1)+mod)%mod)*s[k/l]%mod)%mod;
			//printf("%d %d %d\n",ans,l,r);
		}
		
		printf("%lld\n",ans);
	}
}

signed main() {
	cin>>q>>n;
	init();
	work();
    return 0;
}
/*
100 4000000
10 2345 10000 4000000
100 2345 10000 4000000
1000 2345 10000 4000000
77 22 42494 142992 494924
94 492 92924 249294 24994
294 294 29494 2949222 949492
*/

和题解对拍怎么都是对的,但是就是A不了呜呜呜

2022/8/15 13:58
加载中...