一次十分不友好的t3体验,首先是没有想到可以对gx取模的转换,其次是对模运算的不了解,最后是对多项式除法的不熟悉。好艰难,最后感谢热心分享题解的大佬.
------至于为什么这种多项式除法的实现是正确的,因为g(x)的最高项系数为1,所以一定是可以和d(x)的系数是能匹配的。
#include <bits/stdc++.h>
using namespace std;
const int MOD = 929;
int w, s;
string str;
vector<int> getModule() {
vector<int> ret;
int mod = 0;
auto getCurrentMod = [](char x) {//0大写1小写2数字
if(isdigit(x)) return 2;
if(x >= 'a' && x <= 'z') return 1;
return 0;
};
auto pushEle = [&](char x) {
if(mod == 0) {ret.emplace_back(x - 'A');}
else if(mod == 1) {ret.emplace_back(x - 'a');}
else {ret.emplace_back(x - '0');}
};
for(auto& x: str) {
int currMod = getCurrentMod(x);
if(currMod != mod) {
if(currMod == 1) {//变小写
ret.emplace_back(27);
} else if(currMod == 0) {//变大写
if(mod == 1) {
ret.emplace_back(28);//小写->数字
ret.emplace_back(28);//数字->大写
} else {//数字->大写
ret.emplace_back(28);
}
} else {//变数字
ret.emplace_back(28);
}
}
mod = currMod;
pushEle(x);
}
if(ret.size() & 1) {ret.emplace_back(29);}
vector<int> aux;
for(int i = 0; i < ret.size(); i += 2) {
aux.emplace_back(ret[i] * 30 + ret[i + 1]);
}
return aux;
}
void print(vector<int>& module) {
while((module.size() + 1) % w != 0) {module.emplace_back(900);}
cout << module.size() + 1 << '\n';
for(auto c:module) {
cout << c << '\n';
}
}
vector<int> getG(int k) {
vector<int> ret(k + 1);
ret[0] = -3;
ret[1] = 1;
int A = -9;
for(int i = 2; i <= k; i++) {
vector<int> aux(ret);
for(int j = k; j >= 1; j--) {
ret[j] = ret[j - 1];
}
ret[0] = 0;
for(int j = 0; j <= k; j++) {
int ad = ((aux[j] * A) % MOD);
ret[j] = (ret[j] + ad) % MOD;
}
A = (A * 3) % MOD;
}
return ret;
}
vector<int> calcJYM(vector<int>&d,vector<int>&g,int k){
vector<int> kdx(d.size() + k,0);
for(int i = 0; i < d.size(); i++)
kdx[i + k] = d[i] % MOD;
int lenkdx = kdx.size();
int leng = g.size();
while(lenkdx >= leng) {
int xs = (kdx[lenkdx - 1] / g[leng - 1]) % MOD;
int idx = 0;
for(int i = lenkdx - leng; i < lenkdx; i++) {
kdx[i] -= (g[idx++] % MOD * xs % MOD) % MOD;
}
lenkdx--;
}
vector<int> ret;
int i = leng - 2;
while(kdx[i] == 0) i--;
for(; i >= 0; i--) {
kdx[i] = (-kdx[i]) % MOD;
if(kdx[i] < 0) kdx[i] += MOD;
ret.push_back(kdx[i]);
}
//reverse(ret.begin(),ret.end());
return ret;
}
void calcCheck(vector<int>& module) {
if(s == -1) {
print(module);
return;
}
int k = (1 << (s + 1));
while((module.size() + 1 + k) % w != 0) {module.emplace_back(900);}
int n = module.size() + 1;
vector<int> d(module.rbegin(),module.rend());
d.emplace_back(n);
vector<int> g = getG(k);
vector<int> ret = calcJYM(d,g,k);
for(int i = n - 1; i >= 0; i--) {
cout << d[i] << '\n';
}
for(int i = 0; i < ret.size(); i++) {
cout << ret[i] << '\n';
}
}
int main() {
std::ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> w >> s;
cin >> str;
vector<int> module = getModule();
calcCheck(module);
}