ACM基本算法——枚举、模拟、位运算...

占卜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;
}

发布了54 篇原创文章 · 获赞 26 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43629813/article/details/100120784