zoukankan      html  css  js  c++  java
  • jzoj 5588 %%%

    Description

    给定整数n,m,求有多少个数对(i,j)满足1<=i,j<=n且i mod j>=m。
    有多组数据。
     

    Input

    第一行一个整数t表示数据组数。每组数据一行两个整数n,m。
    t<=100,0<=m<=n<=10^9。

    Output

    每组数据输出一行一个整数表示答案。

     Sol:  


     取反以后数论分块。

     code:

        

      

    #include<bits/stdc++.h>
    #define LL long long
    using namespace std;
    LL ans,n,m,pos,be,ed,epos,eval;
    int T;
    LL get1(LL l,LL r) {
        if (l<m&&r<m) return (l+r)*(r-l+1)/2;
        if (l<m&&r>=m) return (l+m)*(m-l+1)/2+(r-m)*m;
        return (r-l+1)*m;
    }
    LL get2(LL l,LL r) {
        m--;
        pos=n/l;
        be=n-pos*r; ed=n-pos*l;
        if (ed<=m) return m++,(r-l+1)*(be+ed)/2;
        epos=(n-m)/pos+((n-m)%pos>0?1:0); eval=n-pos*epos;
        return m++,(r-epos+1)*(be+eval)/2+(epos-l)*(m-1);
    }
    signed main () {
        freopen("mod.in","r",stdin);
        freopen("mod.out","w",stdout);
        scanf("%d",&T);
        while (T--) {
            scanf("%lld%lld",&n,&m); ans=0;
            if (m==0) {printf("%lld
    ",n*n); continue;}
            for (LL i=1,last;i<=n;i=last+1) {
                last=n/(n/i);
                ans+=n/i*get1(i,last);
                ans+=get2(i,last);
            }
            printf("%lld
    ",n*n-ans);
        } 
        return 0;
    }
  • 相关阅读:
    Electron(3)调用第三方DLL
    Electron(1)概述
    Java SpringMVC(6)Mybatis-Plus
    Socket粘包问题的3种解决方案
    HTTP
    2020再见 2021你好
    再谈领域驱动设计
    使用Domain-Driven创建Hypermedia API
    使用函数式语言来建立领域模型--类型组合
    PHP安装扩展
  • 原文地址:https://www.cnblogs.com/rrsb/p/9878860.html
Copyright © 2011-2022 走看看