51Nod-1284-2 3 5 7的倍数

来源:互联网 发布:网络攻防属于什么专业 编辑:程序博客网 时间:2024/06/04 22:36

给出一个数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

一道特别烧脑子的数学题,毕竟我数学不是太用功,用到了容斥原理,对重复的减的加回来,对重复加的也要减去。

代码(C):

#include <stdio.h>#include <string.h>typedef long long ll;int main(int argc, const char * argv[]){    long long a;    while (~scanf("%lld", &a))    {        //2357        ll a_2 = a / 2;        ll a_3 = a / 3;        ll a_5 = a / 5;        ll a_7 = a / 7;        //2 * 32 * 5......        ll a_6 = a / 6;        ll a_10 = a / 10;        ll a_14 = a / 14;        ll a_15 = a / 15;        ll a_21 = a / 21;        ll a_35 = a / 35;        //2 * 3 * 5......        ll a_30 = a / 30;        ll a_42 = a / 42;        ll a_70 = a / 70;        ll a_105 = a / 105;        //2 * 3 * 5 * 7        ll a_210 = a / 210;        ll ans = a - a_2 - a_3 - a_5 - a_7 + a_6 + a_10 + a_14 + a_15 + a_21 + a_35 - a_30 - a_42 - a_70 - a_105 + a_210;        printf("%lld\n", ans);    }    return 0;}

先减去2、3、5、7的倍数的个数,然后加上两两相乘的倍数的个数,再减去三三相乘的倍数的个数,最后加上2*3*5*7的倍数的个数。当然,是在a的基础上进行操作的。

头大了,一个问题往往想起来用好久,说起来只用一分钟……我的内心是拒绝的!

0 0
原创粉丝点击