USACO SEC.1.3 No.4 Prime Cryptarithm
题意:竖式乘法
解法:简单按照题意枚举模拟即可
可以借用一下大数乘法运算方法里面的一些方式
[][][] * [][] = 先乘法得到结果, 再统一处理进位
/* ID: lsswxr1 PROG: crypt1 LANG: C++ */ #include <iostream> #include <vector> #include <map> #include <list> #include <set> #include <deque> #include <stack> #include <queue> #include <algorithm> #include <cmath> #include <cctype> #include <cstdio> #include <iomanip> #include <cmath> #include <cstdio> #include <string> #include <cstring> #include <fstream> using namespace std; ///宏定义 const int INF = 1000000000; const int MAXN = 15; const int maxn = MAXN; ///全局变量 和 函数 #define USACO #ifdef USACO #define cin fin #define cout fout #endif ////////////////////////////////////////////////////////////////////////// int N; bool num[maxn]; int innum[maxn]; int ans; int col1[5], col2[5], col3[5]; void testNum(int a, int b, int c, int d, int e) { memset(col1, 0, sizeof(col1)); memset(col2, 0, sizeof(col2)); memset(col3, 0, sizeof(col3)); int mul[3]; for (int i = 0; i < 3; i++) { mul[0] = c; mul[1] = b; mul[2] = a; } for (int i = 0; i < 3; i++) { col1[i] += mul[i] * e; } for (int i = 0; i < 4; i++) { if (col1[i] > 10) { col1[i + 1] += col1[i] / 10; col1[i] %= 10; } } if (col1[3] != 0) return; for (int i = 0; i < 3; i++) { if (!num[col1[i]]) return; } //第二行 for (int i = 1; i < 4; i++) { col2[i] += mul[i - 1] * d; } for (int i = 1; i < 4; i++) { if (col2[i] > 10) { col2[i + 1] += col2[i] / 10; col2[i] %= 10; } } if (col2[4] != 0) return; for (int i = 1; i < 4; i++) { if (!num[col2[i]]) return; } //结果 for (int i = 0; i < 4; i++) { col3[i] = col1[i] + col2[i]; } for (int i = 0; i < 4; i++) { if (col3[i] > 10) { col3[i + 1] += col3[i] / 10; col3[i] %= 10; } } if (col3[5] != 0) return; for (int i = 0; i < 4; i++) { if (!num[col3[i]]) return; } ans++; } int main() { #ifdef USACO ofstream fout ("crypt1.out"); ifstream fin ("crypt1.in"); #endif ///变量定义 while (cin >> N) { memset(num, false, sizeof(num)); ans = 0; for (int i = 0; i < N; i++) { int tmp; cin >> tmp; innum[i] = tmp; num[tmp] = true; } for (int d1 = 0; d1 < N; d1++) { for (int d2 = 0; d2 < N; d2++) { for (int d3 = 0; d3 < N; d3++) { for (int d4 = 0; d4 < N; d4++) { for (int d5 = 0; d5 < N; d5++) { testNum(innum[d1], innum[d2], innum[d3], innum[d4], innum[d5]); } } } } } cout << ans << endl; } ///结束 return 0; }