题目描述

xry111发现自己的数论知识不太行,于是准备回顾一下以前学过的数论知识后开始学习高深数论以便解决暗黑数学题。回顾过程中,xry111发现欧拉函数挺有用的(欧拉函数是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n)),xry111刚学欧拉函数时每次求φ(n)时总是习惯从1枚举到n-1,然后依次判断其是否合法。所以对于某些比较大的数,当年的xry111常常数数数到头晕。但是现在作为一个可以讲课可以写题解的xry111来说,他想知道某个数的欧拉值已经不必再一个一个的数啦,因为他可以机智的让你帮忙:对于一个数n,你得告诉xry111其欧拉值φ(n)是多少。

 

输入

多组数据(数据组数大约10^5组),请处理到文件结束,每组数据一行n(1<=n<=10^5)。

 

输出

每组数据输出一行对应的φ(n)值。

--正文

直接预处理就好。。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define SIZE 100001
int euler(int n){
    int res = 1; int i;
    for (i=2;i*i<=n;i++){
        if (n % i == 0){
            n /= i;
            res *= i-1;
            while (n % i == 0){
                n /= i; res*= i;
            }
        }
    }
    if (n > 1) res*= n-1;
    return res;
} 

int e[SIZE+1];
int main(){
    int i;
    e[1] = 1;
    for (i=2;i<=SIZE;i++){
        e[i] = euler(i);
    }
    int n;
    while (scanf("%d",&n) != EOF){
        printf("%d\n",e[n]);
    }
    return 0;
} 

 

posted on 2016-11-27 15:24  Crutain  阅读(246)  评论(0编辑  收藏  举报