zoukankan      html  css  js  c++  java
  • 多功能欧拉筛

    用欧拉筛三合一

    v[i] 表示 i 的最小质因子
    f[i] 表示 i 是不是质数
    prime[i] 表示 第 i 个质数
    phi[i] 表示 i 的欧拉函数值

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int MAXN = 10000005;
    int init() {
    	int rv = 0, fh = 1;
    	char c = getchar();
    	while(c < '0' ||c > '9') {
    		if(c == '-') fh = -1;
    		c = getchar();
    	}
    	while(c >= '0' && c <= '9') {
    		rv = (rv<<1) + (rv<<3) + c - '0';
    		c = getchar();
    	}
    	return fh * rv;
    }
    int n, m, v[MAXN], prime[MAXN], cnt, phi[MAXN];
    bool f[MAXN];
    void Euler_chk(){
    	f[1] = 1;v[1] = 1;
    	for(int i = 2 ; i <= n ; i++) {
    		if(!f[i]) {
    			v[i] = i;
    			prime[++cnt] = i;
    			phi[i] = i - 1;
    		}
    		for(int j = 1; i * prime[j] <= n; j++) {
    			f[i * prime[j]] = 1;
    			v[i * prime[j]] = prime[j];
    			if(!(i%prime[j])) {
    				phi[i * prime[j]] = phi[i] * prime[j];
    				break;
    			}
    			phi[i * prime[j]] = phi[i] * (prime[j] - 1);
    		}
    	}
    }
    int main() {
    	n = init(); m = init();
    	Euler_chk();
    	for(int i = 1 ; i <= n ; i++) printf("%d %d
    ", i, phi[i]);
    	for(int i = 1; i <= m ; i++) {
    		if(f[init()]) printf("No
    ");
    		else printf("Yes
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    sipp如何避免dead call
    6174问题
    笨小熊
    scanf 与 cin 的区别
    谁获得了最高奖学金
    _int64、long long 的区别
    小光棍数
    简单排序法
    La=LaULb (循环链表)
    删除重复的数(顺序有序表)
  • 原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8515238.html
Copyright © 2011-2022 走看看