問題
http://community.topcoder.com/stat?c=problem_statement&pm=1924&rd=5867
暗号化された文字列があり、それを復号したい。
あらかじめ暗号化された文字pool、配列data,keysが与えられる。
復号後の文字列のi番目の文字は、
(data[i]*k)%keys[i]=1となる最小の正の整数kを求め、
j=k%(poolのサイズ)としたとき、pool[j]の文字となる。
このとき、復号後の文字列を求める。
解き方
問題文の理解ができれば、同じように実装するだけ。
コード
#define all(c) (c).begin(),(c).end()
#define FORE(i,d,e) for(int i=d;i<e;i++)
#define FOR(i,s,e) for (int i = int(s); i != int(e); i++)
#define FORIT(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()
class TerribleEncryption {
public: string decrypt(string pool, vector<int> data, vector<int> keys) {
int n=data.size(),m=pool.size();
string str="";
FORE(i,0,n){
int k=1;
while((data[i]*k)%keys[i]!=1)k++;
str+=pool[k%m];
}
return str;
}
};
#define FORE(i,d,e) for(int i=d;i<e;i++)
#define FOR(i,s,e) for (int i = int(s); i != int(e); i++)
#define FORIT(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()
class TerribleEncryption {
public: string decrypt(string pool, vector<int> data, vector<int> keys) {
int n=data.size(),m=pool.size();
string str="";
FORE(i,0,n){
int k=1;
while((data[i]*k)%keys[i]!=1)k++;
str+=pool[k%m];
}
return str;
}
};