poj 3090 欧拉函数简单应用

来源:互联网 发布:java线程和进程区别 编辑:程序博客网 时间:2024/06/05 09:20


找出n * n的方格中有多少不同的直线斜率;

分成三个部分,首先是斜率为1和两个坐标轴,然后是被三条直线切成的两个部分,这个的话求出一部分*2,一部分假设斜率为x/y(x < y),那么肯定是最简式,即x 和 y互质,就是欧拉函数的应用了;

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<vector>#include<algorithm>#include<map>using namespace std;const int maxn = 1000 + 10;#define INF 0x3f3f3f3f#define clr(x,y) memset(x,y,sizeof x )typedef long long ll;#define eps 10e-10const ll Mod = 1000000007;typedef pair<ll, ll> P;int euler[maxn];ll a[maxn];void Init(){    euler[1] = 1;    for(int i = 2; i < maxn; i ++)        euler[i] = i;    for(int i = 2; i < maxn; i ++)        if(euler[i] == i)        for(int j = i ; j < maxn; j += i)        euler[j] = euler[j] /i *(i - 1);    a[0] = 0;    a[1] = 0;    for(int i = 2; i < maxn; i ++)        a[i] = a[i - 1] + euler[i];//    cout << a[1] << " " << a[2] << endl;}int main(){    int n;    Init();    int Tcase;    scanf("%d",&Tcase);    for(int ii = 1; ii <= Tcase; ii ++)//    while( ~ scanf("%d",&n) && n)    {        scanf("%d",&n);        printf("%d %d %d\n",ii,n,a[n] * 2 + 3);    }    return 0;}


原创粉丝点击