A. Strange Partition
题意:给一个长度为
n
n
n的序列和
x
x
x,可以把两个数合并成一个数,问任意操作后
⌈
a
[
i
]
x
⌉
\left \lceil \frac{a[i]}{x} \right \rceil
⌈xa[i]⌉和最大值。
思路:两个数
a
,
b
a,b
a,b,
⌈
a
+
b
x
⌉
≤
\left \lceil \frac{a+b}{x}\right \rceil \le
⌈xa+b⌉≤
⌈
a
x
⌉
+
⌈
b
x
⌉
\left \lceil \frac{a}{x} \right \rceil + \left \lceil \frac{b}{x} \right \rceil
⌈xa⌉+⌈xb⌉,所以最小值就是合并所有数,最大值就是不合并。
AC代码:
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for (int i=(a);i<=(b);i++)
#define per(i,a,b) for (int i=(a);i>=(b);i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define sz(x) ((int)(x).size())
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
const int N=3e5+10;
int n,x;
int a[N];
void solve()
{
ll sum1=0,sum2=0;
cin>>n>>x;
rep(i,0,n-1)
{
cin>>a[i];
sum1+=a[i];
sum2+=a[i]/x+(a[i]%x!=0);
}
cout<<sum1/x+(sum1%x!=0)<<' '<<sum2<<endl;
}
int main()
{
ios::sync_with_stdio(0); cin.tie(0);
int t;
cin>>t;
while(t--) solve();
return 0;
}
B. Strange List
题意:给一个数组长度为 n n n的数组 a a a和 x x x,如果 a [ i ] a[i] a[i]整除 x x x,就在数组后加 x x x个 a [ i ] x \frac{a[i]}{x} xa[i],否则操作停止,求最后数组和为多少?
思路:加 x x x个 a [ i ] x \frac{a[i]}{x} xa[i]就是加 a [ i ] a[i] a[i],枚举 b [ i ] b[i] b[i]如果整除 x x x, s u m + a [ i ] sum+a[i] sum+a[i]直到 b [ i ] b[i] b[i]不能整除 x x x为止
AC代码:
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for (int i=(a);i<=(b);i++)
#define per(i,a,b) for (int i=(a);i>=(b);i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define sz(x) ((int)(x).size())
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
const int N=3e5+10;
int n,x;
int a[N],b[N];
void solve()
{
ll sum=0;
cin>>n>>x;
rep(i,0,n-1)
{
cin>>a[i];
b[i]=a[i];
sum+=a[i];
}
int j=0;
while(b[j]%x==0)
{
b[j]/=x;
sum+=a[j];
j=(j+1)%n;
}
cout<<sum<<endl;
}
int main()
{
ios::sync_with_stdio(0); cin.tie(0);
int t;
cin>>t;
while(t--) solve();
return 0;
}