又到了轻松加愉快的博客时间!!
链接:https://www.nowcoder.com/acm/contest/135/A
来源:牛客网
题目描述
若一个集合A内所有的元素都不是正整数N的因数,则称N与集合A无关。
给出一个含有k个元素的集合A={a1,a2,a3,...,ak},求区间[L,R]内与A无关的正整数的个数。
保证A内的元素都是素数。
输入描述:
输入数据共两行: 第一行三个正整数L,R,k,意义如“题目描述”。 第二行k个正整数,描述集合A,保证k个正整数两两不相同。
输出描述:
输出数据共一行: 第一行一个正整数表示区间[L,R]内与集合A无关的正整数的个数
示例1
输入
复制
1 10 4 2 3 5 7
输出
复制
1
示例2
输入
复制
2 10 4 2 3 5 7
输出
复制
0
说明
对于30%的数据:1<=L<=R<=10^6 对于100%的数据:1<=L<=R<=10^18,1<=k<=20,2<=ai<=100
这一题用dfs遍历。为什么用到dfs?
答:因为[l,r]中间的数可能能被集合A中的任意一个或者多个整除,所以用dfs来分别遍历选和不选a[i]。代码看起来挺简单,要是对dfs不熟悉的话,用自己的脑子去遍历一遍还是很容易混淆的。
贴代码:
#include<stdio.h>
#define ll unsigned long long
long long ans=0;
ll l,r,k,i,j;
ll a[105];
void solve(ll i,ll d,ll l,ll r)
{
if(i==k)
{
ans+=d*(r-l);
return ;
}
solve(i+1,-d,l/a[i],r/a[i]);
solve(i+1,d,l,r);
}
int main()
{
scanf("%lld%lld%lld",&l,&r,&k);
for(i=0;i<k;i++)
{
scanf("%lld",&a[i]);
}
solve(0,1,l-1,r);
printf("%lld\n",ans);
return 0;
}
结束语:emmmm...这么高深的代码怎么可能是我写出来的(是我写的,其实是看了别人的代码,了解了大佬的算法),所以这篇博客以转载存在,感谢某客某佬---某某某。感谢感谢.....
(手动滑稽)