nyoj1007(euler 函数)

euler(x)公式能计算小于等于x的并且和x互质的数的个数;

我们再看一下如何求小于等于n的和n互质的数的和, 我们用sum(n)表示;

若gcd(x, a)=1,则有gcd(x, x-a)=1;

证明:假设gcd(x, x-a)=k (k>1),那么有(x-a)%k=0---1式,x%k=0---2式; 由1式和2式可得 a%k=0---3式; 由2式和3式可得gcd(x, a)=k,与gcd(x, a)=1矛盾,即原式得证;

由此我们可以得知小于x并且与x互质的数必然是成对出现的并且有对应的一对数和为x;

所以有sum(n)=euler(n)/2*n;

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1007

题意:给出n和m,求满足条件gcd(x, n)>=m的x的x的和,其中1<=x<=n,1<= n, m <= 1e9;

思路:对于任意的x和n,有:x=a*q;

              n=b*q;

其中q=gcd(x, n),所以gcd(a, b)=1;

所以对于本题,我们可以枚举符合条件的q, 对于每个q对应的b,euler(b)即为所有符合条件的a的数目;

不过本题要求我们求所有符合条件的x的和,sum(b)是所有符合条件的a的和,x=a*q;对于每个符合条件的q对应的x的和,我们用solve(b)表示;

那么solve(b)=q*sum(b),累加所有符合条件的q下的solve(b)即为本题答案;

代码:

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define mod 1000000007
 4 #define MAXN 100000
 5 using namespace std;
 6
 7 ll euler(ll x){
 8     if(x<2){
 9         return 0;
10     }
11     int ans=1;
12     for(int i=2; i*i<=x; i++){
13         if(x%i==0){
14             ans*=i-1;
15             x/=i;
16         }
17         while(x%i==0){
18             x/=i;
19             ans*=i;
20         }
21     }
22     if(x>1){
23         ans*=x-1;
24     }
25     return ans;
26 }
27
28 ll solve(ll x){
29     if(x==1){
30         return 1;
31     }else{
32         return euler(x)*x/2;
33     }
34 }
35
36 int main(void){
37     ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
38     int t;
39     cin >> t;
40     while(t--){
41         ll n, m, ans=0;
42         cin >> n >> m;
43         for(int i=1; i*i<=n; i++){
44             if(n%i==0){
45                 if(i>=m){
46                     ll cnt=n/i;
47                     ans+=(i*solve(cnt))%mod;
48                 }
49                 if(i*i!=n&&n/i>=m){
50                     ll cnt=i;
51                     ans+=(n/cnt*solve(i))%mod;
52                 }
53             }
54         }
55         cout << (ans%mod+mod)%mod << endl;
56     }
57     return 0;
58 }
时间: 2024-08-07 21:19:43

nyoj1007(euler 函数)的相关文章

euler函数

看了老半天,调试了几遍还是没理解代码啥意思,咋写出来的,看来时间是最好的解决办法,等我过几天再推推,先记住这十三行代码 int euler(int n) { int ret=n,i; for (i=2;i*i<=n;i++) if (n%i==0) { ret=ret-ret/i; while (n%i==0) n/=i; } if (n>1) ret=ret-ret/n; return ret; }

nyoj998(euler)

题意:题意:给出n和m,求满足条件gcd(x, n)>=m的x的gcd(x, n)的和,其中1<=x<=n,1<= n, m <= 1e9: 思路:此题和nyoj1007差不多,比1007简单一点:http://www.cnblogs.com/geloutingyu/p/5966998.html(1007题解) 1 #include <iostream> 2 #include <stdio.h> 3 #define ll long long 4 usi

POJ2480 Longge&#39;s problem 欧拉函数的应用 &amp;&amp; 积性函数

题意很简单,求sum(gcd(i,n))   1<=i<=n; 这题看到后第一反应并没有里用积性函数的性质,不过也可以做,欣慰的是我反应还是比较快的 设f(n)=gcd(1,n)+gcd(2,n)+....+gcd(n-1,n) + gcd(n,n), 用g(n,i)表示满足 gcd(x,n)=i的 x的个数 (x小于n),则 f(n)=sum{i*g(n,i)}; 同时又利用 扩展欧几里德的性质  gcd(x,n)=i  的充要条件是 gcd(x/i,n/i)==1,所以 满足 x/i的解有

欧拉函数hdu——————1286

现在先来解释下欧拉函数的的定义: 就是  正整数n里  小于N且与N互质(gcd为1)的数. (度娘:在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目.此函数以其首名研究者欧拉命名,它又称为Euler's totient function.φ函数.欧拉商数等. 例如φ(8)=4,因为1,3,5,7均和8互质.) Problem Description 新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,

51Nod 1136 欧拉函数 Label:数论

对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目.此函数以其首名研究者欧拉命名,它又称为Euler's totient function.φ函数.欧拉商数等.例如:φ(8) = 4(Phi(8) = 4),因为1,3,5,7均和8互质. Input 输入一个数N.(2 <= N <= 10^9) Output 输出Phi(n). Input示例 8 Output示例 4 代码 1 #include<iostream> 2 #include<cstring> 3

BZOJ2818 GCD 【欧拉函数,线性筛】

题目大意: 给一个范围[1,n],从中找出两个数x,y,使得gcd(x,y)为质数,问有多少对(x,y有序) 解法: 不难,欧拉函数练手题,可以定义集合P ={x|x为素数},那么我们枚举gcd(x,y)可能等于的情况,对于任意p∈P可以得到:gcd(k1·p,k2·p) = p,当且仅当gcd(k1,k2) =1;那么我们就只需要枚举所有的k1,k2了.不妨设k1>k2,那么给定k1,k2的个数就是phi(k1),因为有序,所以给phi*2,但是,这样是否漏算了呢?没错,漏算了(1,1),补上

杭电3501Calculation 2 欧拉函数

Calculation 2 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2982    Accepted Submission(s): 1231 Problem Description Given a positive integer N, your task is to calculate the sum of the posit

HDOJ 1787 GCD Again(欧拉函数)

GCD Again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2611    Accepted Submission(s): 1090 Problem Description Do you have spent some time to think and try to solve those unsolved problem a

欧拉函数总结【数论】【欧拉函数】

欧拉函数的定义:euler(k)=([1,n-1]中与n互质的整数个数). eg:euler(8)=4.由于1,3,5,7均和8互质. 能够推出下面公式: euler(k)=(p1-1)(p2-1)--(pi-1)*(p1^(a1-1))(p2^(a2-1))--(pi^(ai-1)) =k*(p1-1)(p2-1)--(pi-1)/(p1*p2*--pi); =k*(1-1/p1)*(1-1/p2)....(1-1/pk)  故euler函数表达通式:euler(x)=x(1-1/p1)(1-