60pts求助!大样例已过,WA#4~#13
查看原帖
60pts求助!大样例已过,WA#4~#13
846637
ThChamp楼主2025/1/15 00:04
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

typedef long long ll;
const int MAXK=100000003, MAXP=6000000;
const ll MOD=1000000007;
int prm[MAXP], cnt=0, T;
ll K, P, Q, dis, n;
bool vis[MAXK];

void prm_cnt(int m) {
	for (int i = 2; i<=m; i++) {
		if (!vis[i]) prm[++cnt] = i;
		
		for (int j = 1; 1ll*i * prm[j]<=m; j++) {
			vis[i*prm[j]] = true;
			if (i%prm[j] == 0) break; 
		}
	}
}

ll get_n(ll k) { // 求k的因子的个数(去重)
	ll res = 0;
	if (k==1) return 0ll;
	for (int i = 1; i <= cnt && prm[i]*prm[i]<=k; i++) {
		if (k%(1ll*prm[i]) == 0) res++;
		while (k%(1ll*prm[i]) == 0) k/=(1ll*prm[i]);
	}
	return res;
}
ll fpm_2(int m) { // 求2^m (mod 1e9+7) 
	ll res=1, a=2;
	while (m) {
		if (m & 1) res = (res*a)%MOD;
		a=(a*a)%MOD;
		m>>=1;
	}
	return res;
}

int main() {
	prm_cnt(MAXK);
	scanf("%d", &T);
	while (T--) {
		scanf("%lld %lld %lld", &K, &P, &Q);
		dis = (Q-P+1)%MOD;
		if (K == 1) {
			printf("%lld\n", dis);
			continue;
		}
		n = get_n(K);
		if (K >= 2) n++; // 1也要算因子 
		printf("%lld\n", (fpm_2(n)*dis)%MOD);
	}
	return 0;
}
2025/1/15 00:04
加载中...