拯救阿拉德大陆 (容斥原理)

拯救阿拉德大陆
描述
阿拉德大陆是冒险家们活动的主要区域,地下城与勇士的冒险故事也主要发生在这片广袤的土地…
阿拉德大陆的文明之光最初是由精灵和人类共同创造的,但是后来由于双方关系破裂,精灵逐渐从阿拉德大陆上…
目前阿拉德大陆上主要分布着以下势力:德洛斯帝国、贝尔玛尔公国、虛祖、班图、暗精灵王国等。
德洛斯帝国的前身是强大的佩鲁斯帝国。当年,因为混沌之神奥兹玛的报复,帝国在血之诅咒蔓延下灭亡了。经过长时间的累积,帝国的后裔们重新建立起新的军事强国一 德洛斯帝国,并且继承了佩鲁斯的野心,意图再次统一整片大陆。
贝尔玛尔公国距今已有500多年的历史,那里幅员辽阔、土地肥沃。公国现任女王为斯卡迪,但是实际上权利都掌握在33位议员手里。目前,公国正被被德洛斯帝国占领中。
拥有超过2000年历史的文明古国虚祖,虽然土地面积不大,却是个不容小觑的国家;那里几乎人人习武,而且素喃工坊制作的武器也是天下一绝。
班图族是居住在斯特鲁山脉北部边界所有部族的总称。如今它已被分裂成几个小部族,分别是沃克族、库尼族和图卢斯族。这些部族间的关系虽不和睦,但是每隔30年,冰龙斯卡萨苏醒后,各部族间仍是会齐心协力地翻越山岭。
与其他势力不同,暗精灵王国是建在地底洞穴的国家。暗精灵们因为天生的戒备心,所以国家实施的是与世隔绝的政策。但是由于一次瘟疫的横行, 暗精灵与邻国贝尔玛尔公国关系恶化,战争一触即发。

现在的阿拉德大陆混战不断、瘟疫横行,可以说是处于一个动荡不安、满目疮痍的黑暗时期。生活在水深火热的人们急切地期盼着英雄的到来,他们希望真正的勇士能够赶走灾难,为阿拉德大陆带来久违的和平…
此时一批勇士也随之而来,但其能力也是参差不齐,我们需要挑选出最优秀的勇士来守护这片大陆。每位勇士都有属于自己的编号,而我们现在有四张卡片里面分别标记了一个号码, 当勇士的编号为其中某-张卡片中号码的倍数时说明该勇士是优秀的。
目前有n名勇士(编号1−n)并且告诉你卡片内的号码,请你计算出能挑选出多少位勇士

输入
第一个行读入一个正整数n

第二行读入四个正整数a,b,c,d分别表示四张卡片内的号码

输出
输出挑选出来的勇士个数

样例
输入复制
10
2 3 5 7
输出复制
9
提示
数据规模
对于%100的数据,1<=n<=1e18,1<=a,b,c,d<=1e7
思路:本题的问题在于数据规模过大,我们要找出n以内是a,b,c,d的倍数的且不重复的数有多少个,所以采用容斥原理解决。
代码:

#include <stdio.h>
long long a,b,c,d,n,ans,Bab,Bac,Bad,Bbc,Bbd,Bcd,Babc,Babd,Bacd,Bbcd,Babcd;
long long gcd(long long x,long long y)
{
	return y==0?x:gcd(y,x%y);
}
long long lcm(long long x,long long y)
{
	return x*y/gcd(x,y);
}
int main()
{
	scanf("%lld%lld%lld%lld%lld",&n,&a,&b,&c,&d);
	
	Bab=lcm(a,b);
	Bac=lcm(a,c);
	Bad=lcm(a,d);
	Bbc=lcm(b,c);
	Bbd=lcm(b,d);
	Bcd=lcm(c,d);
	
	Babc=lcm(a,Bbc);
	Babd=lcm(a,Bbd);
	Bacd=lcm(a,Bcd);
	Bbcd=lcm(b,Bcd);
	
	Babcd=lcm(Bab,Bcd);
	
	ans=n/a+n/b+n/c+n/d-n/Bac-n/Bab-n/Bad-n/Bbc-n/Bbd-n/Bcd+n/Babc+n/Babd+n/Bacd+n/Bbcd-n/Babcd;
	
	printf("%lld",ans);
	return 0;
}
posted @ 2020-03-08 22:16  键盘_书生  阅读(116)  评论(0编辑  收藏  举报