• 51nod 1284 2 3 5 7的倍数


    基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题
     收藏
     关注
    给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数。 例如N = 10,只有1不是2 3 5 7的倍数。
    Input
    输入1个数N(1 <= N <= 10^18)。
    Output
    输出不是2 3 5 7的倍数的数共有多少。
    Input示例
    10
    Output示例
    1

    容斥原理 

    第一次接触

    举个例子

    A∪B∪C∪D=|A|+|B|+|C|+|D| - |A∩B| - |B∩C| - |C∩A|- |A∩D| - |B∩D| - |C∩D|+|A∩B∩C|+|A∩B∩D| +|A∩C∩D|+|B∩C∩D| -|A∩B∩C∩D|



    推导过程我们可以先看三个,比如你过程中出现的|B∪C∪D|

    |B∪C∪D|=|B|+|C∪D|-|B∩(C∪D)|=|B|+|C|+|D|-|C∩D|-|[(B∩C)∪(B∩D)]|

    =|B|+|C|+|D|-|C∩D|-|B∩C|-|B∩D|+|B∩C∩D|

    //

    关于此题 代码上已经推出了非常多的规律了 

    分开写会爆longlong 

    合在一起写就行

    知道规律是非常快的 

    235的集合数就是5集合数/2*3


    #include <iostream>
    using namespace std;
    int main()
    {
    	//long long v2,v3,v5,v7;
    	//long is23,is25,is27,is35,is37,is57,is235,is237,is257,is357,is2357;
    	long long n;
    	cin>>n;
    	/*v2 = n / 2;
    	v3 = n / 3;
    	v5 = n / 5;
    	v7 = n / 7;
    	is23 = v3 / 2;
    	is25 = v5 / 2;
    	is27 = v7 / 2;
    	is35 = v5 / 3;
    	is37 = v7 / 3;
    	is57 = v7 / 5;
    	is235 = v5 / 6;
    	is237 = v7 / 6;
    	is257 = v7 / 10;
    	is357 = v7 / 15;
    	is2357 = v7 / 30;
    	//cout<<v2<<' '<<v3<<' '<<v5<<' '<<is23<<' '<<is35<<' '<<is25<<' '<<is235<<' '<<endl;
    	long long ans = v2 + v3 + v5 + v7 - is23 - is25 -is27 - is35 - is37 - is57 + is235 + is237 + is257 + is357 - is2357;
    	ans = n - ans;
    	cout<<ans<<endl;*/
    	long long ans;
    	ans = n - (n / 2 + n / 3 + n / 5 + n / 7 - n / 6 - n / 10 - n / 14 - n / 15 - n / 21 - n / 35 + n / 30 + n / 42 + n / 70 + n / 105 - n / 210);
    	cout<<ans<<endl;
    	return 0;
    }


  • 相关阅读:
    题解 P1030 【求先序排列】
    行列式及其打开方式
    题解 P2580 【于是他错误的点名开始了】
    题解 P1130 【红牌】
    题解 P5239 【回忆京都】
    题解 P1184 【高手之在一起】
    【笔记】自学ST表笔记
    题解 P1208 【[USACO1.3]混合牛奶 Mixing Milk】
    树状数组自学笔记
    EBS R12.2系统logo的修改
  • 原文地址:https://www.cnblogs.com/zeolim/p/12270718.html
Copyright © 2020-2023  润新知