SCU3502 The Almost Lucky Number
Description
A lucky number is a number whose decimal representation contains only the digits \(4\) and \(7\). An almost lucky number is a number that is divisible by a lucky number. For example, \(14\), \(36\) and \(747\) are almost lucky, but \(2\) and \(17\) are not. Note that a number can be both lucky and almost lucky at the same time (for example, \(747\)).
You are given long longs a and b. Return the number of almost lucky numbers between \(a\) and$ \(b\) ,inclusive.
Input
Multiple test cases.
Each test cases is two number \(a\),\(b\) in a line seperated by a space.
\(a\) will be between \(1\) and \(10^{10}\), inclusive.
\(b\) will be between \(a\) and \(10^{10}\), inclusive.
Output
For each test case, output the answer in a single line.
Sample Input
1 10
14 14
1 100
1234 4321
Sample Output
3
1
39
1178
首先不难想到\([1,10^{10}]\)内的lucky number不多,我们可以枚举出来,且可以去除包含关系(即若\(a \mid b\),\(b\)就没有存在的必要了)。这样算下来本质上有用的lucky number个数\(N\)只是\(O(10^3)\)级别。
首先答案每次区间可减性,即\([a,b]\)的答案为\([1,b]\)的答案减去\([1,a-1]\)答案。对于区间\([1,n]\),我们显然可以用\(2^N\)的容斥原理。但是\(N\)太大,看上去\(2^N\)会TLE。但是由于LCM变化太大,当LCM比\(n\)大时候break复杂度就在期望的范围内了。但是可能需要卡卡常数(我懒得卡了)。
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef long long ll;
#define maxn (10010)
ll A,B,lucky[maxn]; int tot,N; bool exist[maxn];
inline ll gcd(ll a,ll b) { return b?gcd(b,a%b):a; }
inline void dfs(ll num,int logten)
{
if (logten > 10) return;
if (logten) lucky[++tot] = num;
dfs(num*10LL+4LL,logten+1); dfs(num*10LL+7LL,logten+1);
}
inline void DFS(ll range,ll &res,ll lcm,int now,int f)
{
if (now > N) { if (lcm > 1) res += (range/lcm)*f; return; }
DFS(range,res,lcm,now+1,f);
ll d = gcd(lcm,lucky[now]);
if (lcm <= (range*d+lucky[now])/lucky[now]&&lcm/d*lucky[now]<=range)
DFS(range,res,lcm/d*lucky[now],now+1,-f);
}
inline ll calc(ll range)
{
ll ret = 0;
DFS(range,ret,1,1,-1);
return ret;
}
int main()
{
freopen("3502.in","r",stdin);
freopen("3502.out","w",stdout);
dfs(0,0);
for (int i = 1;i <= tot;++i)
for (int j = 1;j <= tot;++j)
{
if (i == j) continue;
if (!(lucky[i] % lucky[j])) exist[i] = true;
}
for (int i = 1;i <= tot;++i) if (!exist[i]) lucky[++N] = lucky[i];
while (scanf("%lld %lld",&A,&B) != EOF) printf("%lld\n",calc(B)-calc(A-1));
fclose(stdin); fclose(stdout);
return 0;
}
SCU3502 The Almost Lucky Number的更多相关文章
- 枚举 + 进制转换 --- hdu 4937 Lucky Number
Lucky Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...
- HDOJ 4937 Lucky Number
当进制转换后所剩下的为数较少时(2位.3位),相应的base都比較大.能够用数学的方法计算出来. 预处理掉转换后位数为3位后,base就小于n的3次方了,能够暴力计算. . .. Lucky Numb ...
- 题目1380:lucky number
转载请注明文本链接 http://blog.csdn.net/yangnanhai93/article/details/40441709 题目链接地址:http://ac.jobdu.com/prob ...
- HDU 3346 Lucky Number
水题 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> us ...
- 九度oj 题目1380:lucky number
题目描述: 每个人有自己的lucky number,小A也一样.不过他的lucky number定义不一样.他认为一个序列中某些数出现的次数为n的话,都是他的lucky number.但是,现在这个序 ...
- 『NYIST』第九届河南省ACM竞赛队伍选拔赛[正式赛二]- Nearly Lucky Number(Codeforces Beta Round #84 (Div. 2 Only)A. Nearly)
A. Nearly Lucky Number time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- ZOJ 3233 Lucky Number
Lucky Number Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Original I ...
- B - Nearly Lucky Number
Problem description Petya loves lucky numbers. We all know that lucky numbers are the positive integ ...
- lightoj 1097 - Lucky Number(线段树)
Lucky numbers are defined by a variation of the well-known sieve of Eratosthenes. Beginning with the ...
随机推荐
- nodejs创建ejs工程
<Node.js开发指南>创建ejs项目的命令为: express -t ejs microblog.执行后,创建的是jade项目.在express3.x,express4.x中创建ejs ...
- jquery登录验证插件
最近写了个登录验证的jquery插件,其中功能还不是很完善,需要进一步改进,先放出来看看先. /** * 功能描述:本模块实现普通网站登录验证,以后可以添加二维码验证,以及第三方帐号登录验证 * 关联 ...
- Insert后返回自动插入的生成的ID:select @@identity
当运行完插入语句后,执行select @@identity就可得到自动生成的id 如果是sql server 最好用:select SCOPE_IDENTITY() as id因为@@identity ...
- [转]SharePoint 2010/2013 使用Javascript来判断权限的三种方法
本文讲述SharePoint 2010/2013 使用Javascript来判断权限的三种方法的实现方式及其优缺点. 1. 根据用户所在的SharePoint组(比如用户在Leader 组才可以使用审 ...
- Unity3D 之UGUI 按钮
新建一个按钮 按钮对应的属性 按钮下面只有一个文本的 游戏对象,是Button对应的显示文字 Interactable -->是否可以交互 Transition -->变换,对应各种关于按 ...
- 广告系统中weak-and算法原理及编码验证
wand(weak and)算法基本思路 一般搜索的query比较短,但如果query比较长,如是一段文本,需要搜索相似的文本,这时候一般就需要wand算法,该算法在广告系统中有比较成熟的应 该,主要 ...
- 使用反射让Spinner选择同一选项时触发onItemSelected事件
翻看源码,Spinner判断是否触发onItemSelected,是在它的基类AdapterView里面做的: void checkSelectionChanged() { if ((mSelecte ...
- bzoj1231: [Usaco2008 Nov]mixup2 混乱的奶牛
思路:状压dp,设f[i][j]表示当前已经选出的牛的状态为i,最后一头选出的牛为j的方案数. 然后注意就是初值不能是f[0][i]=1,因为所有牛本来都可以第一个被选中,然而这样一定初值有些牛可能就 ...
- HOW TO: Creating your MSI installer using Microsoft Visual Studio* 2008
Quote from: http://software.intel.com/en-us/articles/how-to-creating-your-msi-installer-using-visual ...
- 更新ACCESS数据库出现“字段太小而不能接受所要添加的数据的数量。试着插入或粘贴较少的数据。”的解决方法
今天进行数据调试时出现“字段太小而不能接受所要添加的数据的数量.试着插入或粘贴较少的数据.”,跟踪发现是在更新数据库的数据时出现的. 打开数据库表格发现出错的数据字段类型被定义为“文本”,也就是数据最 ...