占卜DIY(模拟题,牛客)
题目:https://ac.nowcoder.com/acm/contest/1004/B
getn()函数得到堆序号,在life()函数中利用抽到K减少一次生命完成循环的抽取操作。因为有四条生命,在主函数中控制四次life()函数的执行。每翻开一张牌,对应堆的cnt++,最后记录cnt为4的堆数。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char q[15][5];
int st[15],cnt[15];
int getn(char c){
if(c=='A')return 1;
if(c>='2'&&c<='9')return c-'0';
if(c=='0')return 10;
if(c=='J')return 11;
if(c=='Q')return 12;
if(c=='K')return 13;
}
void life(int i){
int a=getn(q[13][i]);//抽取生命牌最上面一张
while(a!=13){//不是k
cnt[a]++;
a=getn(q[a][st[a]--]);//从这堆的最下面抽一张
}
}
int main(){
for(int i=1;i<=13;i++){
st[i]=4;//没有翻开的牌数,最开始都是4
for(int j=1;j<=4;j++)
scanf("%s",q[i]+j);
}
for(int i=1;i<=4;i++)
life(i);//4次抽到k结束
int ans=0;
for(int i=1;i<=12;i++){//记录除k外四张都被翻开的牌数
//printf("%d ",cnt[i]);
if(cnt[i]==4)
ans++;
}
printf("%d\n",ans);
return 0;
}
Raising Modulo Numbers(快速幂,位运算,牛客)
题目:https://ac.nowcoder.com/acm/contest/996/B
下面是求(a^b)modp,如果是求(a*b)modp,乘变加,ans初始值=0即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll ans[45010],a[45010],b[45010];
ll qpow(ll a,ll b,ll mod){
ll ans=1;
while(b>0){
if(b&1)//取二进制最末端
ans=(ans*a)%mod;
b>>=1;
a=(a*a) %mod;//b右移一位,a自乘
}
return ans%mod;
//将b写成二进制的形式,遇到1就与结果相乘
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
ll z,m,h;
ll a,b,cnt;
cin>>z;
while(z--){
cin>>m>>h;
cnt=0;
for(ll i=0;i<h;i++){
cin>>a>>b;
cnt+=qpow(a,b,m)%m;
}
cout<<cnt%m<<endl;
}
return 0;
}