HDU——2588 数论应用

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2588

题目大意:题目要求小于等于n且与n的最大公约数大于等于m的所有数的个数

方法:使用欧拉函数

那么应该怎么去写呢?首先欧拉函数只能求出小于n且与n互质的所有数的个数,但是里面有我们所需要的数字,所以我们可以对欧拉函数进行修改一下,加一些限制条件,使得能够筛选出我们需要的数字

代码:

 1 #include<cstdio>
 2 #include <cmath>
 3 #include <iostream>
 4
 5 using namespace std;
 6 int Euler(int n)
 7 {
 8     if(n==1)
 9         return 1;
10     int i=2,m=n,root=(int)sqrt(float(n));
11     while(i<=root)
12     {
13         if(m%i==0)
14         {
15             n-=n/i;
16             while(m%i==0)
17                 m/=i;
18             root=(int)sqrt(float(m));
19         }
20         i++;
21     }
22     if(m!=1)
23     {
24         n-=n/m;
25     }
26     return n;
27 }
28 int solve(int n,int m)
29 {
30     int nn = sqrt(float(n));
31     int ans=0;
32     for(int i=1;i<=nn;i++)
33     {
34         if(n%i) continue;
35         if(i>=m&&i!=nn)
36             ans += Euler(n/i);
37         if(n/i>=m)
38             ans += Euler(i);
39     }
40     return ans;
41 }
42 int main()
43 {
44     int n,t,m;
45     scanf("%d",&t);
46     while(t--)
47     {
48         scanf("%d%d",&n,&m);
49         printf("%d\n",solve(n,m));
50     }
51     return 0;
52 }
时间: 2024-10-18 12:00:49

HDU——2588 数论应用的相关文章

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 4542 数论 + 约数个数相关 腾讯编程马拉松复赛

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4542 小明系列故事--未知剩余系 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 889    Accepted Submission(s): 207 Problem Description "今有物不知其数,三三数之有二,五五数之有三,七七数之有

hdu 1124 数论

题意:求n!中末尾连续0的个数  其实就是2*5的个数 30! 中有5 10 15 20 25 30  是5的倍数有6个   6=30/5; 6/5=1; 这个1 为25 5  10 15 20  25  30 35 40 45 50 55 60  65 70 75 80  85 90 95 100      100/5=20; 25                     50                    75                     100       20/5=4

hdu 3641 数论 二分求符合条件的最小值数学杂题

http://acm.hdu.edu.cn/showproblem.php?pid=3641 学到: 1.二分求符合条件的最小值 /*==================================================== 二分查找符合条件的最小值 ======================================================*/ ll solve() { __int64 low = 0, high = INF, mid ; while(low <=

hdu 4961 数论 o(nlogn)

Boring Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 60    Accepted Submission(s): 30 Problem Description Number theory is interesting, while this problem is boring.   Here is the probl

hdu 1299 数论 分解素因子

题意:求1.1/x+1/y=1/z 给定z 求x,y的个数zsd:1: 要知道这个素数的因子的范围 范围为2--sqrt(n);2: 带入方程得:x = n * n / k + n ; 现在就变成了求x的值.又因为n一定大于k,所以转换成求n * n的分解数: 因为n = p1 ^ e1 * p2 ^ e2 *..........*pn ^ en sum ( n)= ( 1 + e1 ) * ( 1 +e2 ) * .........* ( 1 +en ); sum (n * n) = ( 1

hdu 1104 数论+bfs

题意:给n,m,k;输出n经过+-*%后(n%k+k)%k==((n+1)%k)%k  输出最小路径与运算副 zsd:% 只是求余数 有正负 mod 是求模 无正负. yhd:对m*k求余对 对k求余不对 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 5

hdu 1005 数论 循环

给定 ab 与飞 f1 f2 求f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 分析: 1 因为mod7   0<=f(n)  &&f(n)<=6  有7种取值 2 f(n-1) 与f(n-2) 共有49种组合 所以找到循环取值即可 Problem : 1005 ( Number Sequence ) Judge Status : Accepted RunId : 9085676 Language : G++ Author : xiaon

HDU 2588 GCD

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2588 解题思路: 本来的思路是枚举大于等于M的数S,若S|N,那么KS(KS<N)GCD(KS,N)>=M, 这样有重复的. 而这样有重复的: 若GCD(x,N)>=M. 设y=N/C,那么y的素因子有phi[i],phi[i+1]......., 那么GCD(x*phi[i],N)>=M, 而根据算术基本定理可知上述方法没有重复的. 那么ans=所有大于M的N的因子X的N/X的欧拉函数