hdu 2841 Visible Trees

题目链接

一、题意

给一个nm的矩阵,左下角为(1,1),右上角为(n,m),问从(0,0)点可以看到多少个点。

二、分析

如果(0,0)>(x,y)(0,0)>(x,y)两个向量共线,即(0,0),(x,y),(x,y)三点共线,那后面的那个点(x,y)就看不到了。

如果三点共线,那么向量(x,y)一定可以表示成(kx,ky)(其中kZ+k>1,kx<=n,ky<=m),因此对于一个数对(xy),如果它们存在公因数,那么一定可以化简成最简,即互质的形式,那么这个互质的数对构成的向量应该是和原向量共线的,因此我们只能看到最前面那个互质的数对构成的点,其它不互质的都会被它前面的某个互质的挡住

因此题目转变成求区间[1,m],[1,n]之间互质数的对数

求解办法
选取一个区间(为了优化选取小区间)比如说选取[1,n],枚举n里面的数i,然后对于每个数i我们看它在[1,m]区间内能找到多少互质的数,把这些结果全部累加起来即可。

所以问题的最后变为了,给定一个数字x,找出它和1y里面有多少个数互质。

三、容斥原理解法

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;

//返回1-m中与n互素的数的个数
vector<LL> p;
LL cal(LL n, LL m) {
    p.clear();
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            p.push_back(i);
            while (n % i == 0) n /= i;
        }
    }
    if (n > 1) p.push_back(n); //求n的素因子

    int num = p.size(); //素因子的个数
    LL s = 0;           // 1到m中与n不互素的数的个数

    //枚举子集,不能有空集,所以从1开始
    for (LL i = 1; i < 1 << num; i++) { //从1枚举到(2^素因子个数)
        LL cnt = 0;
        LL t = 1;
        for (LL j = 0; j < num; j++) { //枚举每个素因子
            if (i & (1 << j)) {        //有第i个因子
                cnt++;                 //计数
                t *= p[j];             //乘上这个质因子
            }
        }
        //容斥原理
        if (cnt & 1) //选取个数为奇数,加
            s += m / t;
        else //选取个数为偶数,减
            s -= m / t;
    }
    return m - s; //返回1-m中与n互素的数的个数
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        LL a, b;
        scanf("%lld%lld", &a, &b);
        LL res = 0;
        //从1~n(b现在就是n)之间,找到所有与m(m现在就是i)互质的数字个数
        for (int i = 1; i <= a; i++) res += cal(i, b);
        printf("%lld\n", res);
    }
    return 0;
}
posted @   糖豆爸爸  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2019-06-20 https跳http
2017-06-20 研修项目文件丢失的处理思路
2017-06-20 安装配置GitLab
2016-06-20 使用Nginx+FFMPEG搭建HLS直播转码服务器
Live2D
点击右上角即可分享
微信分享提示