Educational Codeforces Round 86 (Rated for Div. 2)-C. Yet Another Counting Problem(數論,gcd)

添加鏈接描述
題意:
給你三個數a,b,q,查詢q次,每次一個區間,尋找該區間內有多少個x,使得(x%b)%a!=(x%a)%b.
思路:
先求a,b的最小公倍數,每個最小公倍數是一個循環,我們只需要求所查詢的區間內有多少個完整的最小公倍數區間,再加上其餘不完整的部分就ok。
代碼:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int inf=0x7fffffff;
const int mod=1e9+7;
#define int long long
int flag[200005];
signed main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int a,b,q,sum=0,n,x,y;
        cin>>a>>b>>q;
        for(int i=a;i<=a*b;i++)
        {
            if(i%a==0&&i%b==0)
            {
                n=i;
                break;
            }
        }
        for(int i=0;i<n;i++)
        {
            if((i%a)%b!=(i%b)%a)
            {
                sum++;
            }
            flag[i]=sum;
        }
        for(int i=0;i<q;i++)
        {
            cin>>x>>y;
            cout<<(y/n)*sum+flag[y%n]-((x-1)/n)*sum-flag[(x-1)%n]<<" ";
        }
        cout<<endl;
        memset(flag,0,sizeof flag);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章