• ABC156 F


    题目链接
    题意还是比较清楚的,给你q个询问,对每组询问的模数和初始值不同,求满足条件(a_j~ extrm{mod}~m_i < a_{j + 1}~ extrm{mod}~m_i,(0 leq j < n_i - 1))的j的个数
    正向不好求解,那我们可以反着找,也就是找满足条件(a_j~ extrm{mod}~m_i geq a_{j + 1}~ extrm{mod}~m_i,(0 leq j < n_i - 1))的个数
    (a_j~ extrm{mod}~m_i = a_{j + 1}~ extrm{mod}~m_i)时,只有当(d_i=0)的时候满足条件,统计个数即可
    (a_j~ extrm{mod}~m_i > a_{j + 1}~ extrm{mod}~m_i)时,由于(a_i)是递增的,那么他只有在(a_{i+1}>m, a_i<m)的时候满足这个条件,因为对m取模,也就是说,每满足一次这个条件,(sum d_i)除以m的商都会增加1
    因为n远大于k,那我们可以只求一次k,然后找有几次循环,最后再加上不足k的那一次就行了

    #include<bits/stdc++.h>
    using namespace std;
    #define lowbit(x) ((x)&(-x))
    typedef long long LL;
    
    int d[5005];
    
    void run_case() {
        int k, q;
        cin >> k >> q;
        for(int i = 0; i < k; ++i) cin >> d[i];
        while(q--) {
            int n, x, m;
            cin >> n >> x >> m;
            x %= m;
            LL sum = 0, zero = 0;
            for(int i = 0; i < k; ++i) {
                sum += (d[i] % m);
                zero += (d[i] % m == 0);
            }
            LL large = 1LL*((n-1)/k)*sum;
            zero = zero*((n-1)/k);
            for(int i = 0; i < n-1-((n-1)/k)*k; ++i) {
                large += (d[i] % m);
                zero += (d[i] % m == 0);
            }
            cout << n-1-(large+x)/m-zero << "
    ";
        }
    
    }
    
    int main() {
        ios::sync_with_stdio(false), cin.tie(0);
        cout.flags(ios::fixed);cout.precision(10);
        run_case();
        cout.flush();
        return 0;
    }
    
  • 相关阅读:
    第一篇Scrum冲刺博客
    团队作业3--需求改进&系统设计
    团队作业2(追忆少年)—需求规格说明书
    JAVA作业—字符串操作
    团队作业1——团队展示&选题 (追忆少年)
    个人项目作业WC(JAVA)
    自我介绍+软工5问
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业05
  • 原文地址:https://www.cnblogs.com/GRedComeT/p/12362780.html
Copyright © 2020-2023  润新知