zoukankan      html  css  js  c++  java
  • bzoj2005: [Noi2010]能量采集

    不知道什么算法。

    首先求一颗植物(i,j)与能量采集器的连线上有几颗植物。

    答案是(gcd(i,j)-1),设i’= i/gcd(i,j),j’=j/gcd(i,j).

    则这几颗植物是(i’k,j’k)    1<=k<gcd(i,j)且k为整数。

    所以答案就转换成了求很多个gcd。

    因为n和m都比较大,所以我们可以枚举gcd。

    一个数i作为gcd的次数等于 (n/i)*(m/i) – gcd比i大的数。

    gcd比i大的数我们也可以很方便地求出。

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int maxn = 100000 + 10;
    
    long long ans[maxn],cnt[maxn];
    long long m,n,res;
    
    int main() {
        scanf("%lld%lld",&n,&m);
        if(n>m) swap(n,m);
        for(int i=2;i<=n;i++) cnt[i]=(n/i)*(m/i);
        for(int i=n;i>=2;i--) {
            ans[i]=cnt[i];
            for(int j=2;i*j<=n;j++) 
                ans[i]-=ans[i*j];
        }
        for(int i=2;i<=n;i++) res+=(i-1)*ans[i];
        printf("%lld
    ",res*2+n*m);
        return 0;
    }
  • 相关阅读:
    js-AOP
    jQueryUI之autocomplete
    nginx安装配置
    oracle结构语法
    ajax/表单提交 多个相同name的处理方法
    ES6模块化
    docker运维
    帆软报表
    oracle锁表
    香港到大陆IPLC节点故障
  • 原文地址:https://www.cnblogs.com/invoid/p/5527753.html
Copyright © 2011-2022 走看看