【P1013 [NOIP1998 提高组] 进制位】
思路:(20分)
字母所代表的数字不重复,所以进制数l一定大于等于字母个数n−1,即l≥n−1
那么到底是几进制?可以考虑枚举,注意数据范围(3≤n≤9),如果可以枚举进制数l,判断在每个进制下的加法表是否合法,判断加法表考虑一下暴力 O(n2) ,复杂度完全可以接受。
那最大要枚举到多少?最大即为最大的数 (n−1)∗2+1
最终可得 l 枚举的范围 n−1≤l≤2n−1 (显然,如果更大,结果是一样的)
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; char mp[30]; int cnt[30]; char ch; char s[30]; int n; int main(){ scanf("%d\n",&n); int i,j; getchar(); n--; for(i=0;i<n;i++){ getchar(); scanf("%c",&ch); mp[i]=ch; } for(i=0;i<n;i++){ getchar(); scanf("%c",&ch); for(j=0;j<n;j++){ getchar(); scanf("%s",s); if(strlen(s)>1)continue; for(int k=0;k<n;k++){ if(mp[k]==s[0]){ cnt[k]++; } } } } for(i=1;i<n;i++) if(!cnt[i]){ printf("ERROR!\n"); return 0; } for(i=1;i<n;i++){ printf("%c=%d ",mp[i],cnt[i]-1); } printf("\n%d\n",n); return 0; }