比赛传送门:2021牛客暑期多校训练营9_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)
H--Happy Number
样例:
680
输出:
326623
翻译:数字 2、3 和 6 是快乐的,而其他数字都是不快乐的。如果一个整数在十进制表示法中只包含快乐的数字,那么它就是快乐的。例如,2、3、263 是快乐的数字,而 231 则不是。 现在Cuber QQ想知道第n个快乐正整数。
解题思路:
观察可以发现前几位快乐数分别是2,3,6,22,23,26,32,33,36,.......由一位数字组成的快乐数又3^1个,两位组成的快乐数有3^2个,以此类推,我们可以通过前缀和预处理来进行比较第n个快乐数有多少位,找到它有多少位之后(以x为例),判断它的开头是几,我们可以知道位数为x的数一共有3^x个,前1/3是以2开头的,1/3到2/3是以3开头的,最后1/3是以6开头的,x减去前面位数的快乐数总共的个数得到它在这一位的第几个,计算出开头数,得到第一位之后进行递归寻找后面的其他位数。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int n;
long long a[55],sum[55];
void solve(int x){
//cout<<"x="<<x<<endl;
if(x<=3){
if(x==1)cout<<"2"<<endl;
else if(x==2)cout<<"3"<<endl;
else cout<<"6"<<endl;
return;
}
int ans;
for(int i=2;i<=50;i++){
if(x>sum[i-1]&&x<=sum[i]){
ans=i;//x有多少位
break;
}
}
int d=a[ans];
d/=3;
x-=sum[ans-1];//在第几个
if(x<=d){
//前三分之一
cout<<"2";
solve(x+sum[ans-2]);
}else if(x<=2*d){
cout<<"3";
solve(x-d+sum[ans-2]);
}else{
cout<<"6";
solve(x-2*d+sum[ans-2]);
}
return;
}
int main(){
int t;
//cin>>t;
a[0]=1;
for(int i=1;i<=50;i++){
a[i]=a[i-1]*3;
sum[i]+=sum[i-1]+a[i];//3的倍数
}
// while(t--){
cin>>n;
solve(n);
//}
return 0;
}
I)激励模型
题目大意:
矿工A、B在挖矿,给定 a ,挖矿概率,
挖到矿的人挖下一块矿的概率提升 w ,求挖到 n块区块后A拥有区块数的预期.
考察内容:概率期望 结论 乘法逆元
结论:直接输出n*a即可(/x要用逆元)
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mo=998244353;
ll n,w,x,y;
ll ksm(ll a,ll b)
{
ll ans=1;
for(;b;a=a*a%mo,b>>=1)if(b&1)
ans=ans*a%mo;
return ans;
}
int main(){
ios::sync_with_stdio(0); cin.tie(0);
cin>>n>>w>>x>>y;
cout<<n*x%mo*ksm(y,mo-2)%mo<<endl;
}