題目
題目概要
求
數據範圍與約定
數據組數 , , 且 。
思路
既然 是已知的,直接枚舉 和 好了。不妨設 。
考慮容斥計算。去掉有公因子 的,加上 的,而後再減去……
這個可以套個莫比烏斯函數來快速求符號。然後整除分塊加速。每組數據複雜度 。
代碼
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
typedef long long int_;
// #define int_ long long
int readint(){
int a = 0; char c = getchar(), f = 1;
for(; c<'0'||c>'9'; c=getchar())
if(c == '-') f = -f;
for(; '0'<=c&&c<='9'; c=getchar())
a = (a<<3)+(a<<1)+(c^48);
return a*f;
}
template < typename T >
void getMin(T&a,const T&b){if(b<a)a=b;}
const int MaxN = 50005;
bool isPrime[MaxN];
vector< int > primes;
int mu[MaxN];
void sievePrime(int n){
mu[1] = 1;
for(int i=2; i<=n; ++i)
isPrime[i] = true;
for(int i=2,len=0; i<=n; ++i){
if(isPrime[i]){
primes.push_back(i);
mu[i] = -1, ++ len;
}
for(int j=0; j<len; ++j){
if(primes[j] > n/i) break;
isPrime[i*primes[j]] = 0;
if(i%primes[j] == 0){
mu[i*primes[j]] = 0;
break;
}
mu[i*primes[j]] = -mu[i];
}
}
}
int main(){
int a, b, c, d;
sievePrime(MaxN-5);
for(int i=2; i<=MaxN-5; ++i)
mu[i] += mu[i-1];
for(int T=readint(); T; --T){
a = readint(), b = readint();
c = readint(), d = readint();
int k = readint();
a = (a-1)/k, b /= k;
c = (c-1)/k, d /= k;
int_ ans = 0;
for(int l=1,r; l<=b&&l<=d; l=r+1){
r = min(b/(b/l),d/(d/l));
if(l <= a) getMin(r,a/(a/l));
if(l <= c) getMin(r,c/(c/l));
int cnt1 = (b/l)-(a/l);
int cnt2 = (d/l)-(c/l);
int_ cnt3 = mu[r]-mu[l-1];
ans += cnt3*cnt1*cnt2;
}
printf("%lld\n",ans);
}
return 0;
}