zoukankan      html  css  js  c++  java
  • Nastya Studies Informatics

    Nastya Studies Informatics
     
    time limit per test
    1 second
     
    memory limit per test
    256 megabytes
     
    input
    standard input
    output
    standard output
     

    Today on Informatics class Nastya learned about GCD and LCM (see links below). Nastya is very intelligent, so she solved all the tasks momentarily and now suggests you to solve one of them as well.

    We define a pair of integers (a,b)good, if GCD(a,b)=x and LCM(a,b)=y, where GCD(a,b)denotes the greatest common divisor of a and b, and LCM(a,b)denotes the least common multiple of a and b.

    You are given two integers x and y. You are to find the number of good pairs of integers (a,b) such that la,br. Note that pairs (a,b) and (b,a) are considered different if a≠b.

    Input

    The only line contains four integers l,r,x,y (1lr1091xy109).

    Output

    In the only line print the only integer — the answer for the problem.

    Examples
    input
    1 2 1 2
    output
    2
    input
    1 12 1 12
    output
    4
    input
    50 100 3 30
    output
    0
    Note

    In the first example there are two suitable good pairs of integers (a,b)(1,2) and (2,1).

    In the second example there are four suitable good pairs of integers (a,b): (1,12), (12,1),(3,4) and(4,3).

    In the third example there are good pairs of integers, for example, (3,30), but none of them fits the condition la,brl≤a,b≤r.


    题意就是给你一个范围(l,r),让你找有多少个数对(a,b)满足a和b的最大公约数是x,最小公倍数是y

    思路就是对x,y进行质因数分解,这样对于每一个质因数,就会有一个上界和一个下界,而a,b对应的质因数取值也只能取上界或者下界

    这样就可以把所有满足条件的数对都找出来,然后再一个个的判断是否在(l,r)范围里。

    很显然数对的个数不会超过2的二十次方左右,所以不会超时。

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<climits>
    #include<functional>
    #include<queue>
    #include<vector>
    #include<algorithm>
    #define N 1000005
    using namespace std;
    
    long long prime[N+110],len=0,pd[N+100]= {0};
    
    void shushu()
    {
        pd[0]=pd[1]=1;
    
        for(int i=2; i<=N; i++)
        {
            if(pd[i]==0)
            {
                prime[len++]=i;
            }
    
            for(int j=0; j<len; j++)
            {
                if(i*prime[j]>=N)
                    break;
                pd[i*prime[j]]=1;
                if(i%prime[j]==0)
                    break;
            }
        }
    }
    
    long long l,r,x,y,team[100000],team1[100000]= {0},team2[100000]= {0},c1=0,ans=0;
    
    long long ff(long long a,long long b);
    void f(long long x,long long a,long long b)
    {
    
        if(x==c1)
        {
            if(a>=l&&a<=r&&b>=l&&b<=r)
            {
                ans++;
    
            }
    
            return;
        }
        f(x+1,a,b);
    
    
        if(team1[x]!=team2[x])
            f(x+1,a/ff(team[x],team1[x])*ff(team[x],team2[x]),b/ff(team[x],team2[x])*ff(team[x],team1[x]));
    
    
    }
    
    long long ff(long long a,long long b)
    {
        long long ans=1;
    
        while(b>0)
        {
            if(b%2==1)
            {
                ans*=a;
    
            }
    
            a*=a;
            b/=2;
    
        }
        return ans;
    }
    
    int main()
    {
        shushu();
    
        scanf("%I64d %I64d %I64d %I64d",&l,&r,&x,&y);
    
        if(y%x!=0)
        {
            printf("0");
            return 0;
        }
    
        for(int i=0; i<len; i++)
        {
            if(y%prime[i]==0)
                team[c1++]=prime[i];
    
            while(y%prime[i]==0)
            {
                team2[c1-1]++;
                y/=prime[i];
    
            }
    
        }
    
    
    
        if(y>1)
        {
            team[c1++]=y;
            team2[c1-1]++;
        }
    
    
        for(int i=0; i<c1; i++)
        {
            while(x%team[i]==0)
            {
                team1[i]++;
                x/=team[i];
            }
        }
    
        long long a=1,b=1;
    
        for(int i=0; i<c1; i++)
            a*=ff(team[i],team1[i]);
        for(int i=0; i<c1; i++)
            b*=ff(team[i],team2[i]);
    
        f(0,a,b);
        printf("%I64d",ans);
        return 0;
    }
    View Code
    路漫漫其修远兮,吾将上下而求索
  • 相关阅读:
    【转载】[C#]Log4net中的RollingFileAppender解析
    【转载】大数据量传输时配置WCF的注意事项
    Sql 数据引擎中删除用户名、密码信息
    win10 HTTP 错误 500.21
    SQL Server 将Id相同的字段合并,并且以逗号隔开
    C#中2个日期类型相减
    sql server 查询本年的每个月的数据
    sql server 查询本周、本月所有天数的数据
    sql server中的日期函数
    Sql Server 逻辑文件 '' 不是数据库 '' 的一部分。请使用 RESTORE FILELISTONLY 来列出逻辑文件名。
  • 原文地址:https://www.cnblogs.com/tian-luo/p/9198206.html
Copyright © 2011-2022 走看看