求条,过样例
查看原帖
求条,过样例
751062
Diary_Of_Young楼主2025/2/7 15:49
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5000100;
const long long mod = 1000000007;  
int n , m;
bool is_gcd[N];
int que[N] , idx = 0;
int phi[N] , sum[N] , ch[N] , g[N];
int prime[N] , cnt = 0;
bool st[N];
int calc(int k) {  return k * k % mod * (k + 1) % mod * (k + 1) % mod / 4 % mod;}
int gcd(int a , int b){	return b ? gcd(b , a % b) : a;}
void pre(int n) {
    phi[1] = 1;
    memset(st , 0 , sizeof st);
    for(int i = 2 ; i <= n ; i ++) {
        if(!st[i]) {
            prime[++ cnt] = i;
            st[i] = true;
            phi[i] = i - 1;
        }
        for(int j = 1 ; prime[j] <= n / i ; j ++) {
            st[prime[j] * i] = true;
            if(i % prime[j] == 0) {
                phi[i * prime[j]] = phi[i] * prime[j]  % mod;
                break;
            }
            else phi[i * prime[j]] = phi[i] * phi[prime[j]]  % mod ;
        }
    }
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);	cout.tie(0);
	memset(is_gcd , 0 , sizeof is_gcd);
	cin >> m >> n;
	pre(n + 10);
	for(int i = 2 ; i <= n + 10; i ++) g[i] = phi[i] * i / 2 % mod * i % mod;
	sum[1] = g[1] = 1;
	for(int i = 2 ; i <= n + 10; i ++) sum[i] = (sum[i - 1] + g[i] * 2) % mod;
	while(m --)
	{
		int a , b , x , k;
		cin >> a >> b >> x >> k;
		x = x % mod;
		int tmp = gcd(a , b);
		ch[tmp] = x * tmp % mod * tmp  / a / b;
		if(!is_gcd[tmp]){
			is_gcd[tmp] = true;
			que[++ idx] = tmp;
		}
	//	for(int i = 1 ; i<= idx ; i ++) cout << que[i] << ' ';
		int temp = calc(k);
        for(int i = 1 ; i <= idx ; i ++){
            int t = k / que[i];
            temp = temp - sum[t] * que[i] % mod * que[i];
            temp = ((temp + sum[t] * ch[que[i]]) % mod + mod ) % mod;
        }
		cout << (temp % mod + mod) % mod << endl;
	}
	return 0;
}
2025/2/7 15:49
加载中...