1 solutions

  • 1
    @ 2025-8-21 16:48:20

    分享dp解法:

    题目数据n<=1000,m<=1e6,正常暴力肯定不行,所以可以先预处理出所有1->n之间的最大公因数。

    可以用一个f[i][j]数组表示示第i个数到j个数的最大公因数

    输入时自己到自己的最大公因数=自己,所以为

      cin>>f[i][i];
    

    主题部分:

    //用样例n=5,m=3,[a1,a2...an]=[4,12,3,6,7]做演示 
    //i=4,j=5时: 
    		//a[4]和a[5]的最大公因=gcdx(6,7)=f[4][5]=1;
    //i=3,j=4时:
    		//a[3]到a[4]的最大公因=gcdx(3,6)=f[3][4]=3;
    //i=3,j=5时:
    		//a[3]到a[5]的最大公因=gcdx(3,1)=f[3][5]=1;
    //.....以此类推 
    for(int i=n-1;i>=1;i--){//枚举启示点
    		for(int j=i+1;j<=n;j++){//枚举到达点
    			f[i][j]=gcdx(f[i][i],f[i+1][j]);
    		}
    	}
    

    最后查询f[l][r]即可

    • 1

    Information

    ID
    856
    Time
    1000ms
    Memory
    125MiB
    Difficulty
    3
    Tags
    # Submissions
    11
    Accepted
    6
    Uploaded By