内测的时候感觉ED稍微简单一点

这个D出的挺好的

D 萌萌的好数

这题因为n的范围是1e12,直接暴力会超时,所以需要优化复杂度

二分一下

再容斥一下

有一点数学

判断这个数是第几个好数就把不是好数的数去掉,就是减去

[能被3整除的数的个数]——>x/3

再加上

[个位是3的个数]——>x/10+(x%10>=3)

如果个位大于等于3 就多一个 [0,x/10] alt

再减去

[即是3的倍数而且个位是3的数]——>((x/3)/10+((x/3)%10>=1))

那又要是3的倍数而且个位是3的个数

可以考虑 多少乘3的个位是3

就是枚举[1,x/3]中个位是1的有多少个

就再用上面求各位是3的数目的式子求一下就可以了

alt

using namespace std;
#define ll long long int
const int N=3e5+10;
const int inf = 0x3f3f3f3f;
bool ck(ll x,ll n){
    x-=(x/3+x/10+(x%10>=3)-((x/3)/10+((x/3)%10>=1)));
    if(n<=x)return 1;
    else return 0;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin>>t;
    while(t--){
        ll n;
        cin>>n;
        ll l=1,r=1e18;
        while(l<r){
            ll mid=(l+r)>>1;
            if(ck(mid,n)){
                r=mid;
            }
            else l=mid+1;
        }
        cout<<r<<'\n';
    }
    return 0;
}

E 茜茜的计算器

考虑对称性

  1. 1380上下对称
  2. 2 5 0 8左右对称

给出n相当于有n个位置填数进去

如果全是1 3 8 0 就是

如果存在2 5 那么就要考虑对称了

如果n为偶数 就是,

但是存在没有2 5 的情况就要减去 0 8 的情况

0 和 8全排列 alt

如果n为奇数 那么正中间的那个必须是0 8 所以多乘一个2就可以了

alt

算的时候就用快速幂搞一下就好了

然后减的时候要+mod再取模

// 1380
// 25
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
const int N=3e5+10;
const int inf = 0x3f3f3f3f;
const ll mod = 1e9+7;
ll f(ll a,ll b)
{
    ll ans=1;
//     a %= mod;
    while(b>0)
    {
        if(b&1) ans=ans*a%mod;
        a=a*a%mod;
        b=b>>1;
    }
    ans=ans%mod;
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin>>n;
    if(n%2){
        cout<<(f(4,n)+2*((f(4,n/2)-f(2,n/2)+mod)%mod)%mod)%mod<<'\n';
    }
    else{
        cout<<(f(4,n)+(f(4,n/2)-f(2,n/2)+mod)%mod)%mod<<'\n';
    }
//     cout<<f(4,n)<<'\n';
    return 0;
}

感谢观看