1. 程式人生 > >[USACO1.3]牛式 Prime Cryptarithm

[USACO1.3]牛式 Prime Cryptarithm

大意

給定一些數字問下面這個方程的解中只包含這些數字的方案數

(102x1+101x2+100x3)x4+(102x1+101x2+100x3)10x5=103x6102x7101x8100x9(10^2x_1+10^1x_2+10^0x_3)x_4+(10^2x_1+10^1x_2+10^0x_3)10x_5=10^3x_610^2x_710^1x_810^0x_9

思路

因為(102x1+101x2+100x3)x4(10^2x_1+10^1x_2+10^0x_3)x_4這一陀最多是999,然後我們乘法結合+分配一下發現就是乘上一個二位數,這個時候我們列舉一下就好了啦。

程式碼

/*
ID:hzbismy1
LANG:C++
TASK:crypt1
*/
#include<cstdio>
using namespace std;bool ok[10];int n,a,t1,t2,t3,ans;
inline bool check(register int x){while(x){if(!ok[x%10])return false;x/=10;}return true;}
signed main()
{
	freopen("crypt1.in","r",stdin);
	freopen("crypt1.out","w",stdout);
	scanf("%d"
,&n); for(register int i=1;i<=n;i++) scanf("%d",&a),ok[a]=1; for(register int i=111;i<1000;i++)//列舉乘數 { if(!check(i)) continue; for(register int j=11;j<99;j++)//列舉乘數 { if(!check(j)) continue; t1=i*(j%10);t2=i*(j/10);t3=t1+(t2<<3)+(t2<<1); if(!check(t1)||!check(t2)
||!check(t3)) continue;//判斷一下合不合法 if(t1>999||t3>9999)continue;//判斷一下有沒有超出範圍 ans++; } } printf("%d\n",ans);//輸出 }