zoukankan      html  css  js  c++  java
  • BZOJ 2005: [Noi2010]能量采集( 数论 + 容斥原理 )

    一个点(x, y)的能量损失为 (gcd(x, y) - 1) * 2 + 1 = gcd(x, y) *  2 - 1.

    设g(i)为 gcd(x, y) = i ( 1 <= x <= n, 1 <= y <= m ) 的数对(x, y)个数. 这个不好求, 考虑容斥, 设f(i) 为含有公因数 i 的数对(x, y)(1 <= x <= n, 1 <= y <= m)个数 , 显然f(i) = (n / i) * (m / i). 则 g(i) = f(i) - ∑f(i * k) ( k >= 2 , i * k <= min(n, m) ).

    然后answer = ∑(g(i) * 2 - 1) 

    -------------------------------------------------------------------------------------

    #include<bits/stdc++.h>
     
    using namespace std;
     
    typedef long long ll;
     
    const int maxn = 100009;
     
    ll f[maxn];
     
    int main() {
    ll ans = 0;
    int n, m;
    cin >> n >> m;
    int h = min(n, m);
    for(int i = h; i; i--) {
    f[i] = 1LL * (n / i) * (m / i);
    for(int j = i << 1; j <= h; j += i)
       f[i] -= f[j];
    ans += f[i] * ((i << 1) - 1);
    }
    cout << ans << " ";
    return 0;
    }

    -------------------------------------------------------------------------------------

    2005: [Noi2010]能量采集

    Time Limit: 10 Sec  Memory Limit: 552 MB
    Submit: 2272  Solved: 1358
    [Submit][Status][Discuss]

    Description

    栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量。在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起。 栋栋的植物种得非常整齐,一共有n列,每列有m棵,植物的横竖间距都一样,因此对于每一棵植物,栋栋可以用一个坐标(x, y)来表示,其中x的范围是1至n,表示是在第x列,y的范围是1至m,表示是在第x列的第y棵。 由于能量汇集机器较大,不便移动,栋栋将它放在了一个角上,坐标正好是(0, 0)。 能量汇集机器在汇集的过程中有一定的能量损失。如果一棵植物与能量汇集机器连接而成的线段上有k棵植物,则能量的损失为2k + 1。例如,当能量汇集机器收集坐标为(2, 4)的植物时,由于连接线段上存在一棵植物(1, 2),会产生3的能量损失。注意,如果一棵植物与能量汇集机器连接的线段上没有植物,则能量损失为1。现在要计算总的能量损失。 下面给出了一个能量采集的例子,其中n = 5,m = 4,一共有20棵植物,在每棵植物上标明了能量汇集机器收集它的能量时产生的能量损失。 在这个例子中,总共产生了36的能量损失。

    Input

    仅包含一行,为两个整数n和m。

    Output

    仅包含一个整数,表示总共产生的能量损失。

    Sample Input

    【样例输入1】
    5 4


    【样例输入2】
    3 4

    Sample Output

    【样例输出1】
    36

    【样例输出2】
    20

    【数据规模和约定】
    对于10%的数据:1 ≤ n, m ≤ 10;

    对于50%的数据:1 ≤ n, m ≤ 100;

    对于80%的数据:1 ≤ n, m ≤ 1000;

    对于90%的数据:1 ≤ n, m ≤ 10,000;

    对于100%的数据:1 ≤ n, m ≤ 100,000。

    HINT

    Source

  • 相关阅读:
    前端打印去除水印
    mybatis实现多数据库操作(个人封装注解版本)
    vue项目用hbuilder打包成APP后,返回键退出程序的解决办法
    Java迭代器Iterator的remove()方法的使用
    零基础学Java语言(浙江大学mooc)
    Oracle查询一个字段在哪张表里
    slf4j重定向日志输出
    SpringBoot嵌入pentaho-kettle工具实现数据trans转换和job任务手动执行
    Apache的karaf启动报错
    SpringBoot扩展接口- Bean实例化前后扩展点
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4676872.html
Copyright © 2011-2022 走看看