Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int sot(string s){
- int ans = 0;
- Fora(v, s){
- ans *= 10;
- ans += (v - '0');
- }
- return ans;
- }
- string tos(int x){
- if (x == 0) return "0";
- string s = "";
- while (x){
- s += (char)(x % 10 + '0');
- x /= 10;
- }
- reverse(bend(s));
- return s;
- }
- bool cmp(string a, string b){
- if (a.length() != b.length()) return a.length() < b.length();
- return strcmp(a.c_str(), b.c_str()) < 0;
- }
- string add(string a, string b){
- string ans = "";
- while (a.length() < b.length()) a = "0" + a;
- while (b.length() < a.length()) b = "0" + b;
- int carry = 0, rem;
- for (int i = a.length() - 1; i >= 0; --i) {
- rem = (a[i] - '0' + b[i] - '0') + carry;
- ans = (char(rem % 10 + '0')) + ans;
- carry = rem / 10;
- }
- if (carry > 0) ans = "1" + ans;
- return ans;
- }
- string sub(string a, string b){
- string ans = "";
- bool neg = 0;
- while (a.length() < b.length()) a = "0" + a;
- while (b.length() < a.length()) b = "0" + b;
- if (a < b) swap(a, b), neg = 1;
- int carry = 0, rem;
- for (int i = a.length() - 1; i >= 0; --i) {
- rem = a[i] - b[i] - carry;
- carry = 0;
- while (rem < 0) {
- ++ carry;
- rem += 10;
- }
- ans = (char(rem % 10 + '0')) + ans;
- }
- while (ans.length() > 1 && ans[0] == '0') ans.erase(0, 1);
- if (neg) ans = "-" + ans;
- return ans;
- }
- string mul(string a, string b){
- long long sav[2050];
- for (int i = 0; i < 2050; i++)
- sav[i] = 0;
- string ans = "";
- int carry = 0, rem;
- a = "0" + a;
- b = "0" + b;
- for (int i = a.length() - 1; i >= 0; --i)
- for (int j = b.length() - 1; j >= 0; --j)
- sav[i + j] += ((a[i] - '0') * (b[j] - '0'));
- for (int i = a.length() + b.length() - 2; i >= 0; --i){
- rem = sav[i] + carry;
- carry = rem / 10;
- ans = char(rem % 10 + '0') + ans;
- }
- while (ans.length() > 1 && ans[0] == '0') ans.erase(0, 1);
- return ans;
- }
- string divnum(string a, int b){
- string ans;
- int idx = 0;
- int tmp = a[idx] - '0';
- while (tmp < b){
- tmp = tmp * 10 + (a[++idx] - '0');
- }
- while (a.size() > idx){
- ans += (tmp / b) + '0';
- tmp = (tmp % b) * 10 + a[++idx] - '0';
- }
- if (ans.length() == 0){
- return "0";
- }
- return ans;
- }
- int modnum(string a, int b){
- string c = divnum(a, b), d = mul(c, tos(b));
- return sot(sub(a, d));
- }
- int strgcd(string a, int b){
- return __gcd(modnum(a, b), b);
- }
- string lcm(string x, int y){
- return mul(divnum(x, strgcd(x, y)), tos(y));
- }
Add Comment
Please, Sign In to add comment