题意:给定三个个位数,形成A+B的形式,问最大和,
显然十位+个位,再其次十位越大,贡献越大,把十位放上最大的数字,其他随意不影响。
int a[3];
cin>>a[1]>>a[2]>>a[3];
sort(a+1,a+1+3);
cout<
题意:给一串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"<
题意:给定字符串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;
}
题意:问有多少种组合(位置影响),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;
}