首页 > 其他分享 >P5435 基于值域预处理的快速 GCD

P5435 基于值域预处理的快速 GCD

时间:2022-12-10 13:55:45浏览次数:65  
标签:tmp GCD int 值域 P5435 预处理 gcd

P5435 基于值域预处理的快速 GCD

思路

也就是将x分解成a * b * c,然后在分别与另一个数求解gcd
0-1000之内的gcd是可以直接预处理出来的,因为gcd(a,b) = gcd(a%b,b)(a>b)

为什么不分解成两个数呢,因为需要保证>1000的那个数一定是质数

代码

//基于值域的预处理
//也就是大事化小,小的又可以直接算
//将一个1e6的数华为几个小的数,然后直接进行处理就可以了
#include <bits/stdc++.h>
using namespace std;
const int mod=998244353;
using ll=long long;
const int N=5005,M=1e6+5;

vector<int>prime;
bitset<M>st;
int k[M][3],GCD[1005][1005];

void init(int n=1000,int m=1000000) {
    st[1]=1;
    k[1][0]=k[1][1]=k[1][2]=1;
    for(int i=2;i<=m;i++) {
        if(st[i]==0)prime.push_back(i),k[i][0]=1,k[i][1]=i;
        for(auto x:prime) {
            int y=x*i;
            if(y>m)break;
            st[y]=1;
            k[y][0]=k[i][0]*x;
            k[y][1]=k[i][1];
            if(k[y][0]>k[y][1])swap(k[y][0],k[y][1]);
            if(i%x==0)break;
        }
    }
    for(int i=1;i<=n;i++)GCD[i][0]=GCD[0][i]=i;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=i;j++)
            GCD[i][j]=GCD[j][i]=GCD[i%j][j];
}

int gcd(int a,int b) {
    int ans=1,tmp;
    for(int i=0;i<=1;i++) {
        if(k[a][i]>1000) {
            if(b%k[a][i]==0)tmp=k[a][i];
            else tmp=1;
        }
        else tmp=GCD[k[a][i]][b%k[a][i]];
        b/=tmp;
        ans*=tmp;
    }
    return ans;
}

int a[N],b[N];

signed main() {
    init();
    int n;cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)cin>>b[i];
    for(int i=1;i<=n;i++) {
        ll now=1,ans=0;
        for(int j=1;j<=n;j++) {
            now=now*i%mod;
            ans=(ans+now*gcd(a[i],b[j]))%mod;
        }
        cout<<ans<<endl;
    }
    return 0;
}

标签:tmp,GCD,int,值域,P5435,预处理,gcd
From: https://www.cnblogs.com/basicecho/p/16971463.html

相关文章

  • ZROJ237 小T的gcd - 数论 -
    题目链接:http://zhengruioi.com/problem/237题解:首先第一问很简单,如果n个数的gcd为1,答案就是n否则为-1考虑第二问,发现由于lcm是小于等于乘积的,若相等则必然两两互......
  • SPOJ GCDMAT - GCD OF MATRIX
    简要题意给出三个整数\(T,n,m\),\(T\)组询问,每组询问给出四个整数\(i_1,j_1,i_2,j_2\)(数据保证\(i_1,j_1\leqn\\i_2,j_2\leqm\)),计算:\[\sum_{i=i_1}^{i_2}\sum_{j=......
  • SPOJ PGCD - Primes in GCD Table
    简要题意\(T\)组数据,每组数据给出两个整数\(N,M\),求:\[\sum_{i=1}^{N}\sum_{j=1}^{M}{[\gcd(i,j)\in\mathbb{P}]}\]\(1\leqN,M\leq10^7,T\leq10\)思路双倍经验P225......
  • HDU 6273 Master of GCD(差分)
    题目分析贴一个别人的题解这个题就是一个差分数组,因为这数列的最大公约数就是这个数列2的出现2的最少次数的幂乘以3的出现3的最少次数的幂将2和3分开讨论,然后分......
  • 题解——GCD
    给定正整数\(n\),求\(1\lex,y\len\)且\(\gcd(x,y)\)为素数的数对\((x,y)\)有多少对。\(n\le10^7\)题解做法1题意即为求\(S=\sum_{质数p|n}\sum_{i=1}^n\sum_{......
  • Math: GCD greatest common divisor 最大公约数
     Loop:#include<stdio.h>intmain(void){printf("Hello,World!\n");intm,n,r;scanf("%d%d",&m,&n);if(m<n){m=m^n;......
  • 2022 ICPC 济南站 E - Identical Parity // exgcd
    题目来源:2022InternationalCollegiateProgrammingContest,JinanSiteE题目链接:https://codeforces.com/gym/104076/problem/E题意有\(T\)组案例,对于每个案例:......
  • gcd
    ♠useC++11最大公约数若\(a,b\in\mathbbN\)且\(k\mida,b\in\mathbbN\),且不存在更大的\(k\),称\(k\)是\(a,b\)的最大公约数。快速求\(a,b\in\math......
  • 2021 陕西省赛 C - GCD // 整除分块
    题目来源:2021年ICPC国际大学生程序设计竞赛暨陕西省第九届大学生程序设计竞赛题目链接:https://ac.nowcoder.com/acm/contest/35232/C题意给定三个整数\(l\)、\(r\)、\(......
  • 题解 I. gcd -“山大地纬杯”第十二届山东省ICPC大学生程序设计竞赛(正式赛)
    传送门VP的时候失误推错太多次了,写个博客总结一下【大意】求所有长度为\(m\)且和为\(n\)的正整数序列\(a\)的贡献和。其中,每个数列的贡献为\(\displaystyle\s......