HDU2841 一个关于互质的容斥

原创 2016年08月30日 15:30:20

Description
There are many trees forming a m * n grid, the grid starts from (1,1). Farmer Sherlock is standing at (0,0) point. He wonders how many trees he can see.

If two trees and Sherlock are in one line, Farmer Sherlock can only see the tree nearest to him.
Input
The first line contains one integer t, represents the number of test cases. Then there are multiple test cases. For each test case there is one line containing two integers m and n(1 ≤ m, n ≤ 100000)
Output
For each test case output one line represents the number of trees Farmer Sherlock can see.
Sample Input
2
1 1
2 3
Sample Output
1
5

这题主要就是求多少种斜率的问题
每个斜率对应的都只有一棵树
因为后边的会被挡住

斜率的分子和分母是一定互质的

但是肯定不能一个一个求得…那肯定要炸,mn的范围都是1到10万
而我实在想不出什么可以找规律缩到logn这种诡异解法

所以剪一下枝

首先固定一个n,用来找每一个n在m中有几个互质的数
如何与n互质呢…只要和n没有公约数就可以了
所以我们可以分解一下n的质因子
对就是这里,因为分解的是质因子
因此做题前可以进行预处理…
先用艾氏筛法晒下素数…….
找出它的质因子以后就可以就可以容斥了…
又是老一套…

其实这题很简单,但是这么大的数据总是让我感觉我枚举的话会超时…
可是实际上根本不会…这就是正确方法….
以后做题的时候应该先交上试试了……

另外这次出现了一个新的问题需要注意
那就是筛完了素数以后,素数的个数要记住…
在循环的时候不能让坐标大于这个数
因为声明的是全局变量所以在素数小于m的时候再迭代一次下次取值就是0
再膜就会取到0

re无数次

#include <iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<memory.h>
using namespace std;
int sushu[100001];
int sus[100001];
int susu=0;
int n,m;
int ss[200];
int he[200];
int uu=0;
void dfs(int zuobiao,int ceng,int zong)
{
    if(ceng>uu)return ;
    if(zong>m)return;
    else
    {
        int tem=zong*ss[zuobiao];
        he[ceng]+=m/tem;
        for(int a=zuobiao+1;a<=uu;a++)dfs(a,ceng+1,tem);
    }
}
int main()
{
    for(int a=2;a*a<=100000;a++)
    {
        if(sushu[a]==1)continue;
        sus[++susu]=a;
        for(int b=a+a;b<=100000;b+=a)sushu[b]=1;
    }
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>m;
        long long sum=m;
        for(int a=2;a<=n;a++)
        {
            memset(ss,0,sizeof(ss));
            memset(he,0,sizeof(he));
            uu=0;
            int y=a;
            for(int b=1;sus[b]<=y&&b<=susu;b++)
            {
                if(a%sus[b]==0)
                {
                    ss[++uu]=sus[b];
                    while(y%sus[b]==0)y/=sus[b];
                }
            }
            if(y!=1)ss[++uu]=y;
            for(int q=1;q<=uu;q++)dfs(q,1,1);
            for(int q=1;q<=uu;q++)if(q%2)he[q]=-he[q];
            sum+=m;
            for(int q=1;q<=uu;q++)sum+=he[q];
        }
        cout<<sum<<endl;
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

杭电2841 容斥定理求1到n之间和x互质的数的总数

第一次写容斥定理,完全不懂啊,,,弱爆了。。。。。话说这道题最后就是判断横坐标和纵坐标两个值是否互质,如果互质则可以看到,否则看不到。题目: Visible Trees Time Limi...
  • wmn_wmn
  • wmn_wmn
  • 2012年02月25日 11:18
  • 1307

HDU 4135:Co-prime 容斥原理求(1,m)中与n互质的数的个数

Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total...

HDU 4135容斥原理求互质的个数

题意:求a到b范围内的数与n互质的有多少个? 欧拉定理可以求1到m范围内有多少个与m互质,但是现在是(a,b),且不是与b互质,所以就得另想他法了。 容斥原理可以求…… 先把n分解成质因数之乘,设为p...

HDU 2841 Visible Trees(容斥原理,数论)

Visible Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...
  • perAres
  • perAres
  • 2016年04月02日 17:20
  • 144

HDU 2841 Visible Trees(容斥原理)

容斥原理 + 二进制枚举

HDU 2841 Visible Trees(欧拉+容斥)

题意:给个n*m网格,求从(0, 0)点可看到的点数。 思路:显然是求x与y互质的(x, y)个数。设n #include #include #include #include #inclu...

hdu2841 Visible Trees(容斥原理)

http://acm.hdu.edu.cn/showproblem.php?pid=2841 题意:有一个n*m的格点矩形,除坐标轴上都有格点,求原点可以看见的格点个数。 思路:刚开始...

HDU 2841 Visible Trees 解题报告(筛 or 容斥原理)

Visible Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...
  • kbdwo
  • kbdwo
  • 2014年03月09日 14:50
  • 596

hdu 2841(容斥原理)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2841 题意:有一个农民,站在(0,0)点,从(1,1)点到(m,n)点每个点上有棵树,问这个农民能看到...

HDU 4135-Co-prime(容斥求区间内与N互质的个数(队列||位运算))

题目地址:HDU 4135 题意:求[A,B]区间内与N互质的数的个数。 思路:我们可以用容斥计算出[1,B]之间和[1,A-1]之间的与N互质的数,然后相减即可。然后我们用一种快速的方法求出[1...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU2841 一个关于互质的容斥
举报原因:
原因补充:

(最多只允许输入30个字)