其他分享
首页 > 其他分享> > 2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D - Distribution in Metagonia

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