AB语言基础题
C.Count Order
C | Count Order |
题意:两个排列差值
库函数next_permutation使用,支持vector,string
#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int N = 100100;
const int INF = 0x3f3f3f3f;
typedef pair<int,int> PII;
int n,m,s,d;
int main(void){
cin>>n;
string q,qq;
char tmp;
for(int i = 0;i < n;i++){
cin>>tmp;
q+=tmp;
}
for(int i = 0;i < n;i++){
cin>>tmp;
qq+=tmp;
}
if(q < qq)swap(q,qq);
else if(q == qq){
cout<<"0\n";
return 0;
}
int ans = 1;
while(next_permutation(qq.begin(),qq.end())){
if(q == qq)break;
ans++;
}
cout<<ans<<endl;
return 0;
}
D.Semi Common Multiple
D | Semi Common Multiple |
题意:给定N个数,M的范围,求1~M中有多少数字,对任意给定的数字中Ai(已知Ai均为正偶数),都有该数字X = Ai*(p+0.5),其中q是非负整数,题目中均为整数
例子是1~50中满足15= 6*(2+0.5) = 10*(1+0.5)
题解:数学题,转化成x = Ai/2*(2p+1),其中2p+1是奇数。对一开始数组处理,令Ai' = Ai>>1。
转换成x = Ai'*(2p+1),由于X对每个Ai均满足,也就是求该数组最小公倍数,且x一定为Ai的奇数倍,也就是Ai*odd = x,根据这个性质进行检验,如果lcm除以每个Ai都是奇数,就说明可行,然后挑选最后lcm的奇数倍小于m的个数(如果是偶数倍前面的奇数因子都会变成偶数不成立)
#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int N = 100100;
const int INF = 0x3f3f3f3f;
typedef pair<int,int> PII;
typedef long long ll;
int n,m,s,d;
int q[100100];
int main(void){
cin>>n>>m;
bool flag = 0;
for(int i = 1;i <= n;i++){
cin>>q[i];
q[i]>>=1;
}
sort(q+1,q+1+n);
ll lcm = 1;
for(int i = 1;i <= n;i++){
lcm = lcm*q[i]/__gcd((ll)q[i],(ll)lcm);
if(lcm > m){
flag = 1;
break;
}
}
for(int i = 1;i <= n;i++){
if((lcm/q[i])%2 == 0){
flag = 1;
break;
}
}
if(flag)cout<<"0\n";
else{
int num = m/lcm+1;
num>>=1;
cout<<num;
}
return 0;
}
E.Change a Little Bit
E | Change a Little Bit |
题意:给定由0/1组成的序列S,T,定义函数f(s,t)是操作的最小花费...真的看不懂题目...先搁置...