题目连接:
http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1981
题目类型:
数论 - 欧拉函数
数据结构:
无
思路分析:
连接原点的线,
我们需要知道其方程 y = k * x;
相同的 k 代表在同一直线
则:
y / x = k;
所以说, 需要求出 gcd ( x, y ) = 1的数量 ( 不同 k 的数量 )
需要引用欧拉函数 来求得 小于 N 且 与N 互质的数的个数
证明:
略
源代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<iostream>
#include<algorithm>
using namespace std;
/***********************************
欧拉函数
功能: 求不超过 n 且与 n 互素的正整数的个数
***********************************/
int _eulerf( int m )
{
int i,s = 1;
for( i = 2; i * i <= m; i ++ )
{
if( m % i == 0 )
{
m /= i;
s *= i - 1;
while( m % i == 0 )
{
m /= i;
s *= i;
}
}
}
if( m > 1 )
{
s *= m - 1;
}
return s;
}
int main()
{
int i, t, c = 1, n;
scanf( "%d", &t );
while( t -- )
{
scanf( "%d", &n );
int snt = 0;
for( i = 2; i <= n; i ++ )
{
snt += _eulerf( i );
}
printf( "%d %d %d\n", c ++, n, snt * 2 + 3 );
}
return 0;
}