Codeforces Round #828 (Div. 3)
1.
void slove(){
cin >> n;
fel(i,1,n) cin >> a[i];
int sum = 0, ans = 0;
fel(i,1,n){
while(a[i] % 2 == 0){
a[i] /= 2;
sum++;
}
}
if(sum >= n){
cout << 0 <<endl;
return;
}
vector<int>w(n+1);
fel(i,1,n){
int t = i,ww =0;
while(t%2==0){
t/=2;
ww++;
}
w[i] = ww;
}
sort(w.begin()+1, w.begin()+1+n,greater<int>());
fel(i,1,n){
if(sum<n){
sum+=w[i];
ans++;
}
if(sum >= n){
cout << ans <<endl;
return;
}
}
cout << -1 << endl;
}
2.
首先是考虑到因子上面。首先是一个结论1e9以内的最多只有1334个因子。1e18以内的因子最多1e5左右。
所以就可以直接考虑枚举因子分到x, y上,直接暴力枚举就好了。
/*
确实使之前考虑因子的方法
但是感觉大家都没咋讲清楚我还是很懵
大概明白了就是1e9以内的最多因子就只有1334个
1e18也就只有1e5个左右所以直接考虑dfs考虑x和y中某个数分配某个因子即可。
*/
int a,b,c,d,flag,ansx,ansy;
map<int,int>mp;
vector<pair<int,int> >tt;
void init(int x){
for(int i = 2; i*i <= x; i++){
while(x%i==0){
x /= i;
mp[i]++;
}
}
if(x) mp[x]++;
}
void dfs(int ind, int x, int y){//x,y是因子的乘积
if(ind == tt.size()){
int t1=(a / x + 1)*x;
int t2=(b / y + 1)*y;
if(t1<=c&&t2<=d){
flag = 1;
ansx = t1;
ansy = t2;
}
return;
}
//然后就是考虑把因子分别分到两个数里面
int p = tt[ind].first, cnt = tt[ind].second;
int poww = pow(p,cnt);
int res = 1;
for(int i = 0; i<=cnt; i++){
dfs(ind + 1,x*res, y*poww/res);
res *= p;