质因数分解+欧拉筛+线性基

质因数分解:

for(int i=2;i*i<=n;i++){
    if(n%i==0) p.push_back(i);
    while(n%i==0) n/=i;
}
if(n!=1) p.push_back(n);

欧拉函数(线性筛):

//欧拉函数 phi[x]代表[1,x]种与x互质的数的个数
void getphi()
{
    phi[1]=1;int cnt=0;
    for(int i=2;i<=N;i++){
        if(!vis[i]){prime[++cnt]=i;phi[i]=i-1;}
        for(int j=1;j<=tot;j++){
            if(i*prime[j]>N)  break;
            vis[i*prime[j]]=1;
            if(i%prime[j]==0) {phi[i*prime[j]]=phi[i]*prime[j];break;}
            else  phi[i*prime[j]]=phi[i]*(prime[j]-1);
        }
   }
} 

线性基:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct LinearBasis {
    ll a[65];
    void init() {memset(a,0,sizeof(a)); }
    void Insert(ll t) {
        for(int j = 60; j >= 0; j--) if(t>>j&1) {
            if(a[j]) { t ^= a[j]; continue; }
            for(int k = 0; k < j; k++) if(t>>k&1) t ^= a[k];
            for(int k = j+1; k <= 60; k++) if(a[k]>>j&1) a[k] ^= t;
            a[j] = t;
            return;
        }
    }
}A;
int main(){
    int n,x,y;scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&x),A.Insert(x);
    int q;scanf("%d",&q);
    for(int i=1;i<=q;i++){
        scanf("%d%d",&y,&x);
        x^=y;
        for(int j=0;j<=60;j++) if(x>>j&1) x^=A.a[j];
        if(!x) printf("YES\n");
        else printf("NO\n");
    }

勾股数:

a=2*n+1,b=2*n^2+2*n,c=b+1;

原文地址:https://www.cnblogs.com/vainglory/p/9682805.html

时间: 2024-08-01 05:32:11

质因数分解+欧拉筛+线性基的相关文章

欧拉筛 线性筛 素数+莫比乌斯的mu[]

https://blog.csdn.net/qq_39763472/article/details/82428602 模板来自https://blog.csdn.net/Avalon_cc/article/details/81663214 bool isP[N]; int P[N], ind; void Euler() { mem(isP,1); mu[1]=1; ind=0; for(int i=2;i<N;i++) { if(isP[i]) P[ind++]=i, mu[i]=-1; for

欧拉筛&amp;&amp;线性筛

复杂度 n 分析 其实就是把埃筛的改进罢了,避免重复 具体看代码 代码 #include<bits/stdc++.h> using namespace std; bool vis[10000000]; int prime[10000]; int Oulashai(int n){ memset(vis,0,sizeof(vis)); int cnt=0; for(int i=2;i<=n;i++){ if(!vis[i]) prime[cnt++]=i; for(int j=0;j<

素数表的获取(埃氏筛和欧拉筛)

Eratosthenes筛法(埃氏筛) 时间复杂度:O(nlognlogn) 思路 代码 const int maxn=1e6+10; //表长 int prime[maxn],cnt=0; //prime数组存放所以素数,cnt为素数个数 bool st[maxn]; //false为素数 void get_prime(int n){ for(int i=2;i<=n;i++){ if(!st[i]){ prime[cnt++]=i; //把素数i存到prime数组中 for(int j=i+

线性筛素数(欧拉筛)

线性筛素数(欧拉筛) 欧拉筛为啥是\(O(n)\)的呢?我们先来看看代码. #include <cstdio> using namespace std; const int maxn=10000000; int n, m, prime[maxn], isnt_prime[maxn], tot; void get_prime(int n){ isnt_prime[0]=isnt_prime[1]=1; for (int i=2; i<=n; ++i){ //当前数是所有数小于n的数而不只是

欧拉筛(线性筛)

素数筛,就是按照顺序把合数踢掉,剩下的是素数. 欧拉筛是一种O(n)求素数的筛法.他避免了埃拉特斯特尼筛法对同一数的多次筛除. 欧拉筛的原理是只通过数的最小质因数筛数. 先上代码: #include <cstdio> using namespace std; const int maxn=10000000; int n, m, prime[maxn], isnt_prime[maxn], tot; void get_prime(int n){ isnt_prime[0]=isnt_prime[

【bzoj2401】陶陶的难题I “高精度”+欧拉函数+线性筛

题目描述 求 输入 第一行包含一个正整数T,表示有T组测试数据.接下来T<=10^5行,每行给出一个正整数N,N<=10^6. 输出 包含T行,依次给出对应的答案. 样例输入 7 1 10 100 1000 10000 100000 1000000 样例输出 1 2127 18446224 183011304660 1827127167830060 18269345553999897648 182690854273058293758232 题解 “高精度”+欧拉函数+线性筛 由于$i$和$j$

Dirichlet&#39;s Theorem on Arithmetic Progressions POJ - 3006 线性欧拉筛

题意 给出a d n    给出数列 a,a+d,a+2d,a+3d......a+kd 问第n个数是几 保证答案不溢出 直接线性筛模拟即可 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 bool Is_Primes[1000005]; 5 int Primes[1000005]; 6 int A[1000005]; 7 int cnt; 8 void Prime(int n){ 9 cnt=0; 1

Goldbach&#39;s Conjecture POJ - 2262 线性欧拉筛水题 哥德巴赫猜想

题意 哥德巴赫猜想:任一大于2的数都可以分为两个质数之和 给一个n 分成两个质数之和 线行筛打表即可 可以拿一个数组当桶标记一下a[i]  i这个数是不是素数  在线性筛后面加个装桶循环即可 #include<cstdio> #include<cstring> using namespace std; bool Is_Primes[1000005]; int Primes[1000005]; int cnt; void Prime(int n){ cnt=0; memset(Is_

noip复习——线性筛(欧拉筛)

整数的唯一分解定理: \(\forall A\in \mathbb {N} ,\,A>1\quad \exists \prod _{i=1}^{s}p_{i}^{a_{i}}=A\),其中\({\displaystyle p_{1}<p_{2}<p_{3}<\cdots <p_{s}}\)而且 \(p_{i}\)是一个质数, \(a_{i}\in \mathbb {Z} ^{+}\)(摘自维基百科) 欧拉筛通过使每个整数只会被它的最小质因子筛到来保证时间复杂度,可以用来筛质数