百合花数

题目传送门
这个题和优美数对是一场比赛。当时优美数对吃了我太多时间,这个题没有时间思考了。

这个题目放在T2有点难了!

正解

这给题目数据非常大,但是数位其实没有多少。
我们便可以dfs……
然后每连续两位一起考虑。
如果当前\(n\)大于\(r\)了,那么直接return。否则如果大于等于\(l\),并且是十三的倍数,那么答案就加一!

代码十分巧妙

#include<bits/stdc++.h>
using namespace std;

#define ll long long

ll l,r,power[15],n=0;
int ans=0;

void dfs(int u){
    if(n>r) return ;
    if(n>=l&&n%13==0){
        ans++;
    }
    for(int i=1;i<=9;i++){
        n+=power[u*2-1]*i+(10-i)*power[u*2-2];
        dfs(u+1);
        n-=power[u*2-1]*i+(10-i)*power[u*2-2];
    }
}

int main(){
    cin.tie(0)->sync_with_stdio(0);
    freopen("bai.in","r",stdin);
    freopen("bai.out","w",stdout);
    cin>>l>>r;
    power[0]=1;
    for(int i=1;i<=12;i++) power[i]=power[i-1]*10;
    dfs(1);
    cout<<ans<<endl;
}

Tips:pow有可能比较慢,会被卡掉,所以我比较推荐自己提前算哈

0 条评论

目前还没有评论...