站外题求调
  • 板块学术版
  • 楼主Kastic_pd
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/4/17 15:21
  • 上次更新2023/11/5 00:26:21
查看原帖
站外题求调
307815
Kastic_pd楼主2021/4/17 15:21

QAQ题目在这

主要是通过容斥原理将悲剧数字和幸运数字的最小公倍数相加减,来进行搜索。为避免重复搜索,我用了状压来优化。

但不知道为啥有4个点和正确答案差一,不知道那里错了,求大佬调代码...

code:\mathcal{code:}

#include<bits/stdc++.h>
using namespace std;
#define RI register int
#define ll unsigned long long
#define file(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
ll ln,n;
ll l,r;
ll a[25];
ll ans=0,fh;
ll ttt,tt,lcmm,ss;
bool x[1<<15];
ll gcd(ll x,ll y){
	return y==0?x:gcd(y,x%y);
}
ll lcm(int c){
	ss=ln;
	for(RI i=0;i<n;i++)
		if((c>>i)&1)
			ss=ss/gcd(ss,a[i])*a[i];
	return ss;
}
void dfs(int t,int c){
	if(t>n||x[c])
		return;
	x[c]=true;
	fh=1,lcmm=lcm(c);
	if(t&1)
		fh=-fh;
	ttt=r/lcmm,tt=l/lcmm,ttt-=tt;
	ans=ans+fh*ttt;
	for(RI i=0;i<n;i++)
		if(!((c>>i)&1))
			dfs(t+1,c|(1<<i));
	return;
}
int main(){
//	file(lucky);
	scanf("%lld%lld%lld%lld",&ln,&n,&l,&r);
	for(RI i=0;i<n;i++)
		scanf("%lld",&a[i]);
	dfs(0,0);
	printf("%lld",ans);
	return 0;
}
2021/4/17 15:21
加载中...