内测的时候感觉E比D稍微简单一点
这个D出的挺好的
D 萌萌的好数
这题因为n的范围是1e12,直接暴力会超时,所以需要优化复杂度
二分一下
再容斥一下
有一点数学
判断这个数是第几个好数就把不是好数的数去掉,就是减去
[能被3整除的数的个数]——>x/3
再加上
[个位是3的个数]——>x/10+(x%10>=3)
如果个位大于等于3 就多一个 [0,x/10]
再减去
[即是3的倍数而且个位是3的数]——>((x/3)/10+((x/3)%10>=1))
那又要是3的倍数而且个位是3的个数
可以考虑 多少乘3的个位是3
就是枚举[1,x/3]中个位是1的有多少个
就再用上面求各位是3的数目的式子求一下就可以了
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 茜茜的计算器
考虑对称性
- 1380上下对称
- 2 5 0 8左右对称
给出n相当于有n个位置填数进去
如果全是1 3 8 0 就是
如果存在2 5 那么就要考虑对称了
如果n为偶数 就是,
但是存在没有2 5 的情况就要减去 0 8 的情况
0 和 8全排列
如果n为奇数 那么正中间的那个必须是0 8 所以多乘一个2就可以了
算的时候就用快速幂搞一下就好了
然后减的时候要+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;
}
感谢观看