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;
}

猜你喜欢

转载自blog.csdn.net/ACkingdom/article/details/106266897