SDNU_ACM_ICPC_2020_Winter_Practice_4th [Reproduced](新知识点:矩阵快速幂的应用)

Triangle
题意:木棒长度从1开始为1,2,3…的序列,问在一个序列中最少拿出多少木棒才能使剩下的木棒不能构成三角形。
题解:根据序列的特点以及若构成三角形则必须两边之和大于第三边想到斐波那契数列(从第三项开始以后的数字等于前两个数字的和)若剩下的木棒的长度为斐波那契数列则必定无法构成三角形。由于只有20项,所以把1到20的斐波那契数字记录下来就可以。

#include<iostream>
#include<cstdio>
using namespace std;
int a[20]={1,2,3,0,5,0,0,8,0,0,0,0,13,0,0,0,0,0,0,0};
int main( )
{
	int t;
	scanf("%d",&t);
	int count=1;
	while(t--)
	{
		int m;
		int sum=0;
		scanf("%d",&m);
		for(int i=1;i<=m;i++)
		{
			if(a[i-1]==0) sum++;
			else continue;
		}
		printf("Case #%d: %d\n",count,sum);
		count++;
	}
	return 0;
}

Birthday Paradox
题意:给出每年的天数,问在这么多天数的情况下,至少邀请多少人使得有两人同一天生日的概率至少为0.5
题解:在这里插入图片描述代码:

#include<iostream>
#include<cstdio>
using namespace std;
int main( )
{
	int t;
	scanf("%d",&t);
	int count=1;
	while(t--)
	{
		int n;
		scanf("%d",&n);
		int ans=0;
		double sum=1;
		for(int i=n-1;i>=0;i--)
		{
			sum*=i*1.0/n;
			ans++;
			if(sum<=0.5) break;
		}
		printf("Case %d: %d\n",count,ans);
		count++;
	}
	return 0;
 } 

Reverse a Substring
题意:在一个字符中找到一个子串使得将子串翻转后字典序排列降低
题解:只需要找到一个子串即可,那么就可以两两比较,若后边的字母的字典序比前边的字母小,就表示找到。

#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
int main( )
{
	int n;
	string s;
	cin>>n;
	cin>>s;
	int left=0;
	int right=0;
	for(int i=0;i<n-1;i++)
	{
		if(s[i+1]<s[i])
		{
			left=i+1;
			right=i+2;
			break;
		}
	}
	if(left!=0||right!=0)
	cout<<"YES"<<endl<<left<<" "<<right<<endl;
	else
	cout<<"NO"<<endl;
	return 0;
}

Game with Telephone Numbers
题意:给出一个数字串且长度大于等于13,一个电话号码长度为11并且开头必须是8 ,两个人轮流去掉一个数字,当数字串长度变成11时停止,若剩下的数字串为一个电话号码时输出YES否则输出NO
题解:相当与两个人玩游戏,一个人想办法去掉8另一个人想办法保留8并且使8位于第一个。那么固定后面10个数字,比较前边数字8与不是8的个数大小

#include<iostream>
#include<string>
using namespace std;
string s;
int main( )
{
	int n;
	cin>>n;
	cin>>s;
	int sum=0,sum2=0;
	for(int i=0;i<n-10;i++)
	{
		if(s[i]=='8') sum++;
		else sum2++;
	}
	if(sum-sum2+11>=11) cout<<"YES"<<endl;
	else cout<<"NO"<<endl;
	return 0;
}

Magic Square
大水题~~~

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char s[3][4];
void clockwise(char x1)
{
	if(x1=='1')
	{
		int temp=s[0][0];
		s[0][0]=s[1][0]; s[1][0]=s[1][1]; s[1][1]=s[0][1];s[0][1]=temp;
	}
	else if(x1=='2')
	{
		int temp=s[0][1];
		s[0][1]=s[1][1]; s[1][1]=s[1][2]; s[1][2]=s[0][2]; s[0][2]=temp;
	}
	else if(x1=='3')
	{
		int temp=s[1][0];
		s[1][0]=s[2][0]; s[2][0]=s[2][1]; s[2][1]=s[1][1]; s[1][1]=temp;
	}
	else
	{
		int temp=s[1][1];
		s[1][1]=s[2][1]; s[2][1]=s[2][2]; s[2][2]=s[1][2]; s[1][2]=temp;	
	} 
}
void counterclock(char x2)
{
	if(x2=='1')
	{
		int temp=s[0][0];
		s[0][0]=s[0][1]; s[0][1]=s[1][1]; s[1][1]=s[1][0]; s[1][0]=temp;
	}
	else if(x2=='2')
	{
		int temp=s[0][1];
		s[0][1]=s[0][2]; s[0][2]=s[1][2]; s[1][2]=s[1][1]; s[1][1]=temp;
	}
	else if(x2=='3')
	{
		int temp=s[1][0];
		s[1][0]=s[1][1]; s[1][1]=s[2][1]; s[2][1]=s[2][0]; s[2][0]=temp;
	}
	else 
	{
		int temp=s[1][1];
		s[1][1]=s[1][2]; s[1][2]=s[2][2]; s[2][2]=s[2][1]; s[2][1]=temp;
	}
}
int main( )
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
//		memset(s,'0',sizeof(s));
		int n;
		scanf("%d",&n);
		getchar();
		for(int i=0;i<3;i++) scanf("%s",s[i]);
		while(n--)
		{
			char b[2];
			scanf("%s",b);
			if(b[1]=='C')
			clockwise(b[0]);
			else
			counterclock(b[0]);
		} 
	for(int i=0;i<3;i++)
	{ 
		puts(s[i]);	
	}
    }
	return 0;
}

这里有一篇转载的博客关于快速幂与矩阵快速幂:
跳转
Reading comprehension
题解:在这里插入图片描述

#include<iostream>
#include<cstdio>
#include<cstring>
typedef long long ll;
using namespace std;
ll n,m;
struct f
{
	ll s[10][10];
	f() {memset(s,0,sizeof(s));}
};
f mul(f a,f b,ll mod)
{
	f c;
	for(int i=1;i<=3;i++)
		for(int j=1;j<=3;j++)
			for(int k=1;k<=3;k++)
			{
				c.s[i][j]=(c.s[i][j]+a.s[i][k]*b.s[k][j])%mod;
			}
			return c;
}
f q(f x,ll n)
{
	f ans;
	for(int i=1;i<=3;i++)
	ans.s[i][i]=1;
	while(n)
	{
		if(n&1) ans=mul(ans,x,m);
		x=mul(x,x,m);
		n=n>>1;	
	}
	return ans;
}

int main( )
{
	
	f y;	
	y.s[1][1]=y.s[1][3]=y.s[2][1]=y.s[3][3]=1;
	y.s[1][2]=2;
	while(~scanf("%lld%lld",&n,&m))
	{
		f ans=q(y,n-1);
		ll sum=(ans.s[1][1]+ans.s[1][3])%m;
		printf("%lld\n",sum);		
	}
	return 0;
}
发布了29 篇原创文章 · 获赞 2 · 访问量 609

猜你喜欢

转载自blog.csdn.net/qq_44722533/article/details/104151967