您的位置:首页 > 其它

Sum nyoj 欧拉定理简单运用(数论入门)

2014-10-13 19:47 363 查看


Sum

时间限制:1000 ms | 内存限制:65535 KB
难度:3

描述

给你一个数N,使得在1~N之间能够找到x使得x满足gcd( x , N ) >= M,

求解gcd(x,N)的和

输入多组测试数据

每行输出两个数N,M(N,M不超int)
输出输出sum
样例输入
5 3


样例输出
5


上传者
ACM_张书军
欧拉定理:
欧拉定理表明,若n,a为正整数,且n,a互质;gcd(n,a)=1;
觉得维基百科比百度讲解得好些(逃了一天的课 就看了zsj的数论基础-╮(╯▽╰)╭)

http://baike.baidu.com/view/48903.htm?fr=aladdin


http://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E5%AE%9A%E7%90%86_(%E6%95%B0%E8%AE%BA)


/*在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。*/
/*思路:枚举n的因子。
假设n的因子为d。d*gcd(x/d,n/d)=1。
d*Euler(n/d)就是因子为gcd(x,n)=d,从而求gcd(x,n)的和。*/

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

long long Euler(long long n)//欧拉函数
{
long long c=n,i;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
{
while(n%i==0) n/=i;
c=c/i*(i-1);//φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn);
}
}
if(n!=1)
c=c/n*(n-1);
return c;
}

int main()
{
long long  a,b;
while(cin>>a>>b)
{
int cnt;
long long i,c=0;
for(i=1;i*i<=a;i++)
{
if(a%i==0)
{
if(i>=b)
{
cnt=i;//- -
c=c+cnt*Euler(a/cnt);
}
if(i*i!=a&&a/i>=b)//枚举i与n的因子。
{
cnt=a/i;
c=c+cnt*Euler(a/cnt);
}
}
}
cout<<c<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: