スコア付き【ブルーブリッジカップ】

トピックの説明

100 は分数で表すことができます: 100 = 3 + 69258 / 714。
100 = 82 + 3546 / 197 のように表すこともできます。
バンドスコアでは 1 ~ 9 の数字が 1 回のみ表示されます (0 を除く) という特徴に注意してください。
このような分数では、100 には 11 の表現があります。

入力フォーマット

標準入力から正の整数 N を読み取ります (N<1000*1000)

出力フォーマット

プログラムは、1 から 9 までの分数で表されるあらゆる種類の数値を繰り返しなく出力します。

入力サンプル 

100

サンプル出力コピー

11

つまり、n=a+b/c

方法 1 (最も暴力的なアプローチ):

        9つの数字(1~9)の完全な配列

        2 つの for ループを使用して 9 つの数値を 3 つの数値に分割します

        3 つの数値がトピックの要件を満たしているかどうかを判断する式

注: 除算が整数除算であることは特に指定されていないため、デフォルトでは整数除算ではありませんが、このとき除算は加算、減算、乗算になることを避ける必要があります。

時間計算量:

        フルアレンジメントの時間計算量は次のとおりです: n!*n;

        9 つの数値から 2 つのパーティションを配置します。つまり、8 つのギャップ内の 2 つの位置を選択してパーティションを配置します。つまり、9 つの数値を 3 つの部分に分割します。これは C(8,2) です。

        したがって、合計の時間計算量は次のようになります: n!*n*C(8,2)、つまり: 9! *9*8*7/2=91445760

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
bool vis[10];
int n,an[10],ans;
int xten(int l,int r) {
	int temp=0;
	for(int i=l; i<=r; i++) {
		temp=temp*10+an[i]+1;
	}
	return temp;
}
void dfs(int q) {
	if(q==9) {
		for(int i=0; i<=6; i++) {
			for(int j=i+1; j<=7; j++) {
				int a=xten(0,i);
				int b=xten(i+1,j);
				int c=xten(j+1,8);
				if(c*(n-a)==b) ans++;
			}
		}
		return ;
	}
	for(int i=0; i<9; i++) {
		if(!vis[i]) {
			vis[i]=true;
			an[q]=i;
			dfs(q+1);
			vis[i]=false;
		}
	}
}
int main() {
	scanf("%d",&n);
	dfs(0);
	printf("%d\n",ans);
	return 0;
}

方法 2 (時間の複雑さを軽減するために n を使用):

         まず a と c を列挙し、n と a、b、c の関係、つまり b=n*cn*a から b を導出します。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=20;
int n;
bool st[N],backup[N];
int ans=0;
bool check(int a,int c) {
	int b=n*c-a*c;
	if(!a||!b||!c)return false;
	memcpy(backup,st,sizeof(st));
	while(b) {
		int x=b%10;
		if(!x||backup[x])return false;
		backup[x]=true;
		b/=10;
	}
	for(int i=1; i<=9; i++) {
		if(!backup[i])
			return false;
	}
	return true;
}
void dfs_c(int u,int a,int c) {
	if(u==9)return;
	if(check(a,c)) {
		ans++;
	}
	for(int i=1; i<=9; i++) {
		if(!st[i]) {
			st[i]=true;
			dfs_c(u+1,a,c*10+i);
			st[i]=false;
		}
	}
}
void dfs_a(int u,int a) {
	if(a>=n) return ;
	if(a) dfs_c(u,a,0);
	for(int i=1; i<=9; i++) {
		if(!st[i]) {
			st[i]=true;
			dfs_a(u+1,a*10+i);
			st[i]=false;
		}
	}
}
int main() {
	cin>>n;
	dfs_a(0,0);
	cout<<ans<<endl;
	return 0;
}

おすすめ

転載: blog.csdn.net/m0_56501550/article/details/129769201