Codeforces Round #785 D
D. Lost Arithmetic Progression
阅读完样例我们就应该清楚我们C一定被B包含 这个你可以找一些性质 或者直接用map啥的判即可 否则我们输出0
然后我们的C一定要在B“中” 也就是C不能在B的边界 这个看完样例就能反应出来
最后我们考虑有多少个答案 我们直接枚举dc的因数 枚举因数有素数筛的思想直接枚举到根号即可
然后什么条件我们可以更新答案呢 当且仅当lcm(da,db)=dc时即可 然后当然我们要让dc/da也判断一下
最后注意的就是da*da=dc的情况特判一下即可
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
const int M = 998244353;
const int mod = 1000000007;
#define int long long
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define INF 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int gcd(int b,int c){return c==0?b:gcd(c,b%c);}
int lcm(int b,int c){return b * c/ gcd(b, c);}
void solve() {
int b, q, y, c, r, z;
cin >> b >> q >> y >> c >> r >> z;
int ed_b = b + q * (y - 1);
int ed_c = c + r * (z - 1);
if (!(b <= c && ed_c <= ed_b) || r % q != 0 || (c - b) % q != 0)cout << 0 << endl;
else if (c - r < b || ed_c + r > ed_b)cout << -1 << endl;
else {
int ans = 0;
for (int d_a = 1; d_a * d_a <= r; d_a++) {
if (r % d_a == 0) {
if (lcm(d_a, q) == r) {
(ans += (r / d_a) * (r / d_a)) %= mod;
}
if (r / d_a != d_a && lcm(r / d_a, q) == r) {
(ans += d_a * d_a) %= mod;
}
}
}
cout << ans << endl;
}
}
signed main(){
fast
int T;cin>>T;
while(T--) {
solve();
}
return ~~(0^_^0);
}