zoukankan      html  css  js  c++  java
  • XDU 1022 (数论筛法+前缀和)

    解法一:数论筛法+前缀和

    //其实题目中f[n]的值可理解为存在多少个整数对使a*b<=n 
    #include<cstdio>
    #define N 1007
    #define maxn 1000005
    using namespace std; 
    int f[maxn];
    void Procede(int n)//预处理 
    {
        for(int i=1;i<maxn;i++){
            for(int j=i;j<maxn;j+=i){
                f[j]++;
            }
        }
    //此时f[n]理解为表示n的约数的个数,亦可以理解为表示存在多少对整数对(a,b)恰好满足a*b=n f[1]=1,f[2]=2,f[3]=2,f[8]=4,f[10]=3 
        for(int j=1;j<maxn;j++){
            f[j]=(f[j-1]+f[j])%N;
        }//f[n]此时表示存在多少对整数对(a,b)满足a*b<=n,即求了一次前缀和,f[1]=1,f[2]=3,f[3]=5
        for(int j=1;j<maxn;j++){
            f[j]=(f[j-1]+f[j])%N;
        }
    }//此时f[n]表示题目中的sum(1,n),即又求了一次前缀和,f[1]=1,f[2]4,f[3]=9
    int main()
    {
        int a,b;
        Procede(maxn);
        while(scanf("%d%d",&a,&b)!=EOF)
        {
            int ans=(f[b]-f[a-1]+N)%N;
            printf("%d
    ",ans);
        }
    }

    解法二:数论筛法+树状数组

    #include<cstdio>
    #include<cstring>
    #define maxn 1000005
    #define N 1007
    using namespace std;
    int a,b,c[maxn],f[maxn];
    /*int f(int x)
    {
        int s=0;
        for(int i=1;i<=x;i++)
            s+=(x/i);
        return s%N;
    }*/效率太低TLE
    int lowbit(int x)
    {
        return (-x)&x;
    }
    void add(int i,int d)
    {
        while(i<=maxn)
        {
            c[i]+=d;
            i+=lowbit(i);
        }
    }
    int sum(int i)
    {
        int s=0;
        while(i>0)
        {
            s+=c[i];
            i-=lowbit(i);
        }
        return s%N;
    }
    void Precede(int n)
    {
        for(int i=1;i<maxn;i++){
            for(int j=i;j<maxn;j+=i){
                f[j]++;
            }
        }
        for(int j=1;j<maxn;j++){
            f[j]=(f[j-1]+f[j])%N;
            add(j,f[j]);
        }
    }//数论筛法效率不会TLE
    int main()
    {
        Precede(maxn);
        while(scanf("%d%d",&a,&b)!=EOF)
        {
            int s=(sum(b)-sum(a-1)+N)%N;
            printf("%d
    ",s%N);
        }
    }
  • 相关阅读:
    (转)C# DES
    (转)adb shell am 的用法
    (转)C# 解析 json
    (转)C#执行exe程序
    (转) C# textbox 限制输入问题
    (转)C# SSL-X509使用
    事务管理
    spring数据源
    2.spring 学习
    sonarqube 代码检查
  • 原文地址:https://www.cnblogs.com/freinds/p/6292199.html
Copyright © 2011-2022 走看看