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);
}
posted @ 2022-09-13 19:55  ycllz  阅读(24)  评论(0)    收藏  举报