1. 程式人生 > >【找規律】【DFS】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem A. Arithmetic Derivative

【找規律】【DFS】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem A. Arithmetic Derivative

blog r+ clas 可能 .cn can typedef pro 找規律

技術分享

假設一個數有n個質因子a1,a2,..,an,那麽n‘=Σ(a1*a2*...*an)/ai。

打個表出來,發現一個數x,如果x‘=Kx,那麽x一定由K個“基礎因子”組成。

這些基礎因子是2^2,3^3,5^5,7^7,11^11,13^13。只有6個,K不超過30,於是可以dfs。

要註意搜索順序(每次枚舉的時候,都從大於等於前項的開始搜)和可行性剪枝(如果超過r則剪枝,雖說有可能爆long long,但其實整除就可以判,而且沒有精度誤差)。

#include<cstdio>
//#include<set>
#include<algorithm>
#include<cmath>
using namespace std;
//const long double EPS=0.0000000001;
typedef long long ll;
//set<ll>S;
ll base[11],path[1000010];
int pr[11];
int K,e;
ll r;
void dfs(int cur,int pre,ll now){
	if(cur==K){
//		if(S.find(now)==S.end()){
			path[++e]=now;
//			S.insert(now);
//		}
		return;
	}
	for(int i=pre;i<=6;++i){
		if(base[i]>r/now){
			break;
		}
		dfs(cur+1,i,now*base[i]);
	}
}
int main(){
//	freopen("a.in","r",stdin);
//	freopen("a1.out","w",stdout);
	pr[1]=2; pr[2]=3; pr[3]=5; pr[4]=7; pr[5]=11; pr[6]=13;
	for(int i=1;i<=6;++i){
		base[i]=1;
		for(int j=1;j<=pr[i];++j){
			base[i]*=(ll)pr[i];
		}
	}
	while(scanf("%d%lld",&K,&r)!=EOF){
		e=0;
//		S.clear();
		dfs(0,1,1ll);
		printf("%d\n",e);
		sort(path+1,path+e+1);
		if(e){
			for(int i=1;i<e;++i){
				printf("%lld ",path[i]);
			}
			printf("%lld\n",path[e]);
		}
	}
	return 0;
}

【找規律】【DFS】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem A. Arithmetic Derivative