2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D - Distribution in Metagonia
作者:互联网
题意:给出一个n,构造一个序列ans,是的序列ans的所有数的和为n,且序列中的所有数只能有2和3俩种素因子,而且序列中的数俩俩不能整除
题解:找到最大可以被n整除的2的次幂e,在n/e后找到最大的小于n/e的3的次幂s,得到的es就是答案序列的一个数,然后对n-es继续进行前面的操作。
可行性:因为是最大的三次幂,所以n-es后不会有比他还大的三次幂,而n-es后还是有e这个因子,而且n/e是个奇数,s也是个奇数,(n/e-s)*e会有比e更大的二次幂,
可以保证俩俩不能整除
http://codeforces.com/gym/100801
#include<stdio.h>
#define LOCAL
#define ll long long
ll ans[150];
int main(){
#ifdef LOCAL
freopen("distribution.in","r",stdin);
freopen("distribution.out","w",stdout);
#endif
ll t;
scanf("%lld",&t);
while(t--){
ll n;
scanf("%lld",&n);
int cnt=0;
ll e=1,s=1;
while(n!=0){
if(cnt==0){
while(n%e==0)e=e*2ll;
e=e/2;
while(n/e>=s)s=s*3ll;
s=s/3;
ans[++cnt]=s*e;
n=n-s*e;
}
else{
while(n%e==0)e=e*2ll;
e=e/2;
while(n/e<s)s=s/3;
ans[++cnt]=s*e;
n=n-s*e;
}
}
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++){
printf("%lld",ans[i]);
if(i==cnt)printf("\n");
else printf(" ");
}
}
}
标签:cnt,Northern,Contest,Subregional,while,ans,序列,ll,es 来源: https://www.cnblogs.com/League-of-cryer/p/13996802.html