SRM 221 DIV1 Easy - TerribleEncryption (復習○)

問題


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;
}

};
このエントリーをはてなブックマークに追加