AtCoder Beginner Contest 110

A - Maximize the Formula

题意:给定三个个位数,形成A+B的形式,问最大和,

显然十位+个位,再其次十位越大,贡献越大,把十位放上最大的数字,其他随意不影响。

 int a[3]; 
    cin>>a[1]>>a[2]>>a[3];
    sort(a+1,a+1+3);
    cout<

B - 1 Dimensional World's Tale

题意:给一串X,一串Y,问存不存在一个Z,恒大于X,恒小于Y,且满足在一个固定范围内。

取大于X得最大值,小于Y的最小值,若能形成区间且区间和固定范围有交集即有答案。

#define rep(a,b) for(register int i=a;i<=b;i++)
#define red(a,b) for(register int i=a;i>=b;i--)
#define ULL unsigned long long
#define LL long long

using namespace std;

int a[1000],b[1000];
int main()
{
   int N,M,X,Y;
   cin>>N>>M>>X>>Y;
   int flag=1;
   int pre1,pre2;
   rep(1,N)
   {
   	 cin>>a[i];
   } 
   rep(1,M)
   {
   	 cin>>b[i];
   }
   sort(a+1,a+1+N);
   sort(b+1,b+1+M);
   pre1=a[N]+1;
   pre2=b[1];
   if(pre2>X&&pre1<=Y&&pre2>=pre1)
   {
   	cout<<"No War"<

C - String Transformation

题意:给定字符串S,T,且有操作把S中所有x变成y,所有y变成x。

问是否能通过这样的操作变成T。

那么我们可以看出来,如果能替换,一定是所有x只对应所有y的,所有的y也只对应一种,否则就不能替换,因为不对应的那一个没办法和其他的进行同步,也就没有办法同时为正确的字母。

set a[26], b[26];

int main()
{
	int n;
	string y,x;
	cin >> x >> y;
	for (int i = 0; i < x.size(); i++)
	{
		a[x[i] - 'a'].insert(y[i] - 'a');
		b[y[i] - 'a'].insert(x[i] - 'a');
	}
	for (int i = 0; i <= 25; i++)
	{
		if (a[i].size() > 1 || b[i].size() > 1)
		{
			cout << "No" << endl;
			return 0;
		}
	}
	cout << "Yes" << endl;
}

D - Factorization

题意:问有多少种组合(位置影响),n个数连乘=M。

回答:M一定=质因数连乘=P1^a1*P2^a2*.....Pn^an.(唯一分解定理)

也就是说可以拿质因数来组合。

由上面一系列数组成n个数。放进n个位置。最后放进位置里的所有数相乘就是这个位置的数。

从2~根号M,依序进行处理,显然不可能遇到是合数的因数,因为合数的因数质数之前一定处理过。

这个时候处理出质因数的个数,P1有a1个,利用隔板法插进a1个小球,把n-1个隔板往里面插,为了保证公平,每个位置必然有一个小球,为了防止几个隔板插进一个球,但是这个小球是不存在的所以是:a1+n个小球,有a1+n-1个位置,插入n-1个板。

种类:C(a1+n-1,n-1)

但是按上面2~根号的处理,有可能存在一个大于根号M的质因数,但是只会有一个(两个就大于M了),an=1,C(n,n-1)=n。

特判一下即可。组合数求法有空学习一下,这里先套一下模板

#define rep(a,b) for(register int i=a;i<=b;i++)
#define red(a,b) for(register int i=a;i>=b;i--)
#define  ULL unsigned long long
#define  LL long long
const int MOD = 1000000007;
using namespace std;

int N;
int M;
LL ans = 1;
vectorG;
map,int >map0;
int inv(int a) {
	//return fpow(a, MOD-2, MOD);  
	return a == 1 ? 1 : (long long)(MOD - MOD / a) * inv(MOD % a) % MOD;
}
LL C(LL n, LL m)
{
	if (m < 0)return 0;
	if (n < m)return 0;
	if (m > n - m) m = n - m;

	LL up = 1, down = 1;
	for (LL i = 0; i < m; i++) {
		up = up * (n - i) % MOD;
		down = down * (i + 1) % MOD;
	}
	return up * inv(down) % MOD;
}

LL mul(LL a, LL b)
{
	return (a*b) % MOD;
}

long long quickpow(long long n, long long base) {
	long long res = 1;
	while (n) {
		if (n & 1) {
			res = res * base % MOD;
		}
		n >>= 1;
		base = base * base % MOD;
	}
	return res;
}//快速幂 
int pre;

int main()
{
	cin >> N >> M;
	int lim = sqrt(M);
	rep(2, lim)
	{
		if (M%i == 0)
		{
			int cnt = 0;
			while (M%i == 0)
			{
				M /= i;
				cnt++;
			}
			ans = ans * C(N + cnt - 1, N - 1) % MOD;
		}
	}
	if (M != 1)
	{
		ans =( ans * N )% MOD;
	}
	cout << ans << endl;
}

 

你可能感兴趣的:(Atcoder)