1 用DFS进行的打表技巧,每种数字的全排列
题目:
代码实现:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int m,n,i,j;
int a[N],e;
void dfs(int x)
{
if(x>1e10)return;
if(x>10)a[++e]=x;
dfs(x*10+4);
dfs(x*10+7);
return;
}
signed main()
{
int t;
ios::sync_with_stdio(false);
cin>>m>>n;
a[0]=4;
a[1]=7;
e=1;
dfs(4);
dfs(7);
a[++e]=4444444444;
sort(a,a+e);
int e1=lower_bound(a,a+e,m)-a; lower_bound返回的是地址 要减去a[0]的地址才得到下标
int e2=lower_bound(a,a+e,n)-a;
int ans=0;
ans+=a[e1]*(a[e1]-m+1);
ans-=a[e2]*(a[e2]-n);
for(i=e1;i<e2;i++)
{
ans+=a[i+1]*(a[i+1]-a[i]);
}
cout<<ans<<"\n";
return 0;
}
笔记:
1 :
dfs -- 求全排列;
2 :
lower_bound() 用于二分查找区间内第一个 大于等于某值(>= x) 的迭代器位置
upper_bound() 用于二分查找区间内第一个 大于某值(> x) 的迭代器位置