列表

详情


NC222904. 纯情活泼的拆分

描述

更好的阅读体验:

链接:https://pan.baidu.com/s/1o4smgWB19XF7_N_0SJ1R9Q ,提取码:dkq4 。


琪露诺学会了 。所以琪露诺打算将一个数进行拆分,来练习她学会的内容。以下会把这种拆分方式称作「纯情活泼的拆分」。

具体来说,她会把一个正整数 ,拆分成若干个互不相同的大于等于2的自然数的幂次和,即:



很显然地,对于一个 可能存在若干种不同的拆分方式。为此,琪露诺定义了一个「纯情」值 ,用于衡量一种拆分的价值。有:



显然,对于每个 ,存在一种拆分方式使得它的「纯情」值最大,我们将这个最大值记为 的「活泼」值,用 表示。特别地,如果不存在任何一种合法的拆分方式,则 。琪露诺为了验证她的拆分,找到了  个数 。你要做的就是分别求出

输入描述

第一行一个正整数  ,表示琪露诺找来的数的个数。
接下来一行, 个正整数  ,含义如题所示。

输出描述

共  行。其中,第  行输出 

示例1

输入:

4
5 7 19 23

输出:

2
3
5
6

说明:

对于样例 \mathrm 1w_1\sim w_4 ,存在以下一组可能的解:

\Phi(5)=\varphi_5(2:1,3:1)=2 。
\Phi(7)=\varphi_7(2:2,3:1)=3 。
\Phi(19)=\varphi_{19}(2:3,5:1,6:1)=5 。
\Phi(23)=\varphi_{23}(2:3,3:1,5:1,7:1)=6 。

可以证明,不存在比它们更优的拆分方案。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 329ms, 内存消耗: 58040K, 提交时间: 2021-09-20 16:59:30

#include<bits/stdc++.h>
#define N 2000005
#define ll long long
#define mp make_pair
#define fi first
#define se second
using namespace std;
int T,tp;ll ans[N],val[N],t[N];
priority_queue<pair<ll,ll>>q;
ll rd(){
	char c;ll re=0;
	while(!isdigit(c=getchar()));
	while(isdigit(c))re=re*10ll+c-'0',c=getchar();
	return re;
}
int main(){
	q.push(mp(-2,2)),T=2,val[2]=1ll;
	while(!q.empty()){
		ll v=-q.top().fi,x=q.top().se;q.pop();
		tp++;ans[tp]=ans[tp-1]+v;t[x]++,val[x]*=x;
		if(ans[tp]>1e12)break;
		if(x<=1e18/val[x])q.push(mp(-val[x]*(x-1ll),x));
		if(q.empty()||-q.top().fi>T)T++,q.push(mp(-T,T)),val[T]=1ll;
	}
	int TT=rd();
	while(TT--){
		ll x=rd();
		cout<<upper_bound(ans+1,ans+tp+1,x)-ans-1<<'\n';
	}
	return 0;
}

上一题