zoukankan      html  css  js  c++  java
  • Codeforces 475 D. CGCDSSQ


    暴力+维护某个数到前面一个能产生不同GCD的数的位置.......

    D. CGCDSSQ
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    Given a sequence of integers a1, ..., an and q queries x1, ..., xq on it. For each query xi you have to count the number of pairs (l, r) such that 1 ≤ l ≤ r ≤ n and gcd(al, al + 1, ..., ar) = xi.

     is a greatest common divisor of v1, v2, ..., vn, that is equal to a largest positive integer that divides all vi.

    Input

    The first line of the input contains integer n, (1 ≤ n ≤ 105), denoting the length of the sequence. The next line contains n space separated integers a1, ..., an, (1 ≤ ai ≤ 109).

    The third line of the input contains integer q, (1 ≤ q ≤ 3 × 105), denoting the number of queries. Then follows q lines, each contain an integer xi, (1 ≤ xi ≤ 109).

    Output

    For each query print the result in a separate line.

    Sample test(s)
    input
    3
    2 6 3
    5
    1
    2
    3
    4
    6
    
    output
    1
    2
    2
    0
    1
    
    input
    7
    10 20 3 15 1000 60 16
    10
    1
    2
    3
    4
    5
    6
    10
    20
    60
    1000
    
    output
    14
    0
    2
    2
    2
    0
    2
    2
    1
    1
    


    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <map>
    
    using namespace std;
    
    typedef long long int LL;
    
    const int maxn=100100;
    
    map<int,LL> ans;
    int a[maxn],n,m;
    int pre[maxn];
    
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",a+i);
        for(int i=1;i<=n;i++)
        {
            pre[i]=i-1;
            int x=a[i],xi=i;
            for(int j=i;j;j=pre[j])
            {
                a[j]=__gcd(a[j],x);
                ans[a[j]]+=j-pre[j];
                if(a[j]<x)
                {
                    pre[xi]=j;
                    xi=j; x=a[j];
                }
            }
            pre[xi]=0;
        }
        scanf("%d",&m);
        while(m--)
        {
            int x;
            scanf("%d",&x);
            printf("%I64d
    ",ans[x]);
        }
        return 0;
    }
    




  • 相关阅读:
    logdump命令使用
    centos 添加用户并赋予sudo权限
    ogg进程解析
    xxl-job-executor2.2.0添加为默认执行器(docker方式)
    mysql设置数据库默认编码和表名不区分大小写
    linux-curl工具使用
    docker通过dockerfile打java项目镜像
    通过shell检查服务并发送mail告警(shell监控脚本)
    esxi6.5安装教程
    Vmware Vcenter6.5 配置集群和主机
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6946839.html
Copyright © 2011-2022 走看看