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;
    }
    




  • 相关阅读:
    python---模块与包
    python---迭代器与生成器
    python---装饰器
    Python---函数
    Python---文件操作
    Python---数据类型
    浅谈UBUNTU
    java 键盘输入多种方法
    动态规划解最长公共子序列问题
    线段树
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6946839.html
Copyright © 2011-2022 走看看