• 洛谷P3455 [POI2007]ZAP-Queries


    题目链接

    https://www.luogu.com.cn/problem/P3455

    思路

    简单来说,就是求(displaystyle sum^{a}_{i=1}{sum^{b}_{j=1}{[gcd(i,j)==d}]}),不妨令a<b。

    那么很容易想到,将(a)(b)都除以(d),就只要求互质的数对了,就是(displaystyle sum^{a/d}_{i=1}{sum^{b/d}_{j=1}{[gcd(i,j)==1]}})

    然后就是反演题常规套路,枚举g=gcd(i,j),一通乱搞搞出(displaystyle sum^{a}_{D=1}{lfloor frac{a}{D} floor lfloor frac{b}{D} floor})这个东西,再加上整除分块就搞定了。

    代码

    #include<cstdlib>
    #include<algorithm>
    #define maxn (int)(5*1e4+10)
    using namespace std;
    int u[maxn],book[maxn],s[maxn],p[maxn],cnt=0;
    int main(){
        int n,i,j,a,b,d,l,r;
        scanf("%d",&n);
        u[0]=0;u[1]=1;
        for(i=2;i<maxn;++i){
            if(!book[i]){
                u[i]=-1;
                p[++cnt]=i;
            }
            for(j=1;p[j]*i<maxn&&j<=cnt;++j){
                book[i*p[j]]=1;
                if(!(i%p[j])) break;
                u[i*p[j]]=-u[i];
            }
        }
        for(i=1;i<maxn;++i)
            s[i]=s[i-1]+u[i];
        for(i=1;i<=n;++i){
            scanf("%d%d%d",&a,&b,&d);
            if(a>b) swap(a,b);
            a/=d;b/=d;
            int ans=0;
            for(l=r=1;l<=a;l=r+1,r=min(a/(a/l),b/(b/l))){
                ans+=(a/l)*(b/l)*(s[r]-s[l-1]);
                if(r==a) break;
            }
            printf("%d
    ",ans);
        }
        // system("pause");
        return 0;
    }
  • 相关阅读:
    HTTP协议:POST请求
    HTTP协议:GET请求
    HTTP协议
    理解server.xml
    用session实现简单的购物
    session:的工作原理
    session:的生命周期
    session:例子代码(一个session为一个会话而服务)
    session概述&作用
    时间复杂度和空间复杂度
  • 原文地址:https://www.cnblogs.com/landmine-sweeper/p/13896171.html
Copyright © 2020-2023  润新知