线性筛

模板

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
const int N=10000000;
const int mod=19260817;
using namespace std;

int num,prime[N],phi[N],flag[N],last[N],fac[N],rfac[N];

void exgcd(int a,int b,int& x,int& y)
{
	if(!b) {x=1;y=0;return;}
	exgcd(b,a%b,x,y);
	int t=x;
	x=y;
	y=t-(a/b)*y; 
}

int get_inv(int a,int b)
{
	int x,y;
	exgcd(a,b,x,y);
	return (x%b+b)%b;
}

int cnt[N];
void crash(int x)
{
	memset(cnt,0,sizeof(cnt));
	while(x)
	{
		cnt[last[x]]++;
		x/=prime[last[x]];
	}
}

void pre()
{
	fac[1]=phi[1]=1; 
	for(int i=2;i<=100000;i++)
	{
		if(!flag[i])
		{
			prime[++num]=i;phi[i]=i-1;last[i]=num;
		}
		fac[i]=fac[i-1]*i%mod;
		rfac[i]=get_inv(fac[i],mod);
		for(int j=1;j<=num&&i*prime[j]<100000;j++)
		{
			int p=i*prime[j];
			flag[p]=1;last[p]=j;
			phi[p]=phi[i]*phi[prime[j]];
			if(i%prime[j]==0)
			{
				phi[p]=phi[i]*prime[j];
				break;
			} 
		}
	}
}

int main()
{
	pre();
	return 0;
}
原文地址:https://www.cnblogs.com/XYZinc/p/7387614.html