hdu2588-GCD-(欧拉函数+分解因子)

The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes written (a,b),is the largest divisor common to a and b,For example,(1,2)=1,(12,18)=6. 
(a,b) can be easily found by the Euclidean algorithm. Now Carp is considering a little more difficult problem: 
Given integers N and M, how many integer X satisfies 1<=X<=N and (X,N)>=M.

InputThe first line of input is an integer T(T<=100) representing the number of test cases. The following T lines each contains two numbers N and M (2<=N<=1000000000, 1<=M<=N), representing a test case.OutputFor each test case,output the answer on a single line.Sample Input

3
1 1
10 2
10000 72

Sample Output

1
6
260翻译:给出n和m,1<=x<=n,求x符合gcd(x,n)>=m有多少个。解题过程:令d=gcd(x,n),显然d是n的因子,并且是x和n的最大公因子,则gcd(x/d,n/d)=1对于每个d,令y=n/d,找有多少个x/d满足gcd(x/d,y)=1。欧拉函数登场,累加y的欧拉函数值。
 1 #include <iostream>
 2 #include<stdio.h>
 3 #include <algorithm>
 4 #include<string.h>
 5 #include<cstring>
 6 #include<math.h>
 7 #define inf 0x3f3f3f3f
 8 #define ll long long
 9 using namespace std;
10
11 ll euler(ll x)
12 {
13     ll res=x;
14     for(ll i=2;i*i<=x;i++)
15     {
16         if(x%i==0)
17         {
18             res=res/i*(i-1);
19             while(x%i==0)
20                x=x/i;
21         }
22     }
23     if(x>1)
24         res=res/x*(x-1);
25     return res;
26 }
27
28 int main()
29 {
30
31     ll t,n,m,sum;
32     scanf("%lld",&t);
33     while(t--)
34     {
35         sum=0;
36         scanf("%lld%lld",&n,&m);
37         int q=sqrt(n);
38         ll i;
39         for(i=1;i*i<=n;i++)
40         {
41             if(n%i==0)
42             {
43                 if(i>=m)
44                     sum=sum+euler(n/i);
45                 if((n/i)>=m)
46                     sum=sum+euler(i);
47             }
48         }
49         i--;
50         if(i*i==n && i>=m)
51             sum=sum-euler(i);
52         printf("%lld\n",sum);
53     }
54     return 0;
55 }


原文地址:https://www.cnblogs.com/shoulinniao/p/10372119.html

时间: 2024-10-17 19:44:56

hdu2588-GCD-(欧拉函数+分解因子)的相关文章

hdu2588 gcd 欧拉函数

GCD Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1567    Accepted Submission(s): 751 Problem Description The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes writte

HDU 1695 GCD 欧拉函数+容斥原理+质因数分解

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:在[a,b]中的x,在[c,d]中的y,求x与y的最大公约数为k的组合有多少.(a=1, a <= b <= 100000, c=1, c <= d <= 100000, 0 <= k <= 100000) 思路:因为x与y的最大公约数为k,所以xx=x/k与yy=y/k一定互质.要从a/k和b/k之中选择互质的数,枚举1~b/k,当选择的yy小于等于a/k时,可以

HDU 2588 GCD (欧拉函数)

GCD Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1013    Accepted Submission(s): 457 Problem Description The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes writt

HDU 1695 GCD 欧拉函数+容斥定理

输入a b c d k求有多少对x y 使得x在a-b区间 y在c-d区间 gcd(x, y) = k 此外a和c一定是1 由于gcd(x, y) == k 将b和d都除以k 题目转化为1到b/k 和1到d/k 2个区间 如果第一个区间小于第二个区间 讲第二个区间分成2部分来做1-b/k 和 b/k+1-d/k 第一部分对于每一个数i 和他互质的数就是这个数的欧拉函数值 全部数的欧拉函数的和就是答案 第二部分能够用全部数减去不互质的数 对于一个数i 分解因子和他不互质的数包括他的若干个因子 这个

根据要求求除数的数 与 互素和算法 (的品质因数和欧拉函数分解)

Description One day, Qz met an easy problem. But after a 5-hout-long contest in CSU, he became very tired and he wanted to call his girlfriend as soon as possible. As we all know, Qz is a genius in plenty of fields especially in programming. But he d

hdu 1695 GCD 欧拉函数+容斥

题意:给定a,b,c,d,k x属于[1 , c],y属于[1 , d],求满足gcd(x,y)=k的对数.其中<x,y>和<y,x>算相同. 思路:不妨设c<d,x<=y.问题可以转化为x属于[1,c / k ],y属于[1,d/k ],x和y互质的对数. 那么假如y<=c/k,那么对数就是y从1到c/k欧拉函数的和.如果y>c/k,就只能从[ c/k+1 , d ]枚举,然后利用容斥.详见代码: /****************************

hdu 1695 GCD(欧拉函数+容斥原理)

http://acm.hdu.edu.cn/showproblem.php? pid=1695 非常经典的题.同一时候感觉也非常难. 在区间[a,b]和[c,d]内分别随意取出一个数x,y,使得gcd(x,y) = k.问这种(x,y)有多少对.能够觉得a,c均为1,并且gcd(5,7)与gcd(7,5)是同一种. 由于gcd(x,y) = k,那么gcd(x/k,y/k) = 1.也就是求区间[1,b/k]和[1,d/k]内这种(x,y)对使得gcd(x,y) = 1. 为了防止计数反复,首先

[题解](gcd/欧拉函数)luogu_P2568_GCD

求gcd(x,y)=p等价于求gcd(x/p,y/p)=1,转化为了n/p内互质的个数 所以欧拉函数,因为有序所以乘2,再特判一下只有在1,1情况下才会重复计算,所以每次都减一 数组开小一时爽,提交wa火葬场!!! #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=10000009; int n; int ck[maxn],prime[max

HDU5780 gcd 欧拉函数

http://acm.hdu.edu.cn/showproblem.php?pid=5780 BC #85 1005 思路: 首先原式化简:x?^gcd(a,b)??−1 也就是求n内,(公约数是i的对数)*x^i-1的和,其中i为n内的两两最大公约数.那么问题可以转化成先预处理出i,再求和,注意O(n*300)=1,正常情况会卡常数.必须还要优化 由于 ans=∑s[d]∗(x^?d??−1),记s[d]=最大公约数为d的对数 我们注意到求s[d] or (公约数是i的对数),也就是求n/i以