Advertisement
Guest User

Untitled

a guest
Feb 26th, 2020
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.01 KB | None | 0 0
  1. /*BINH :))*/
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. typedef long long ll;
  5. typedef long double ld;
  6. typedef unsigned long long llu;
  7. #define IO ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  8. #define f  first
  9. #define s  second
  10. #define mp make_pair
  11. #define pb push_back
  12. #define ep emplace_back
  13. #define sz(a) (int) a.size()
  14. #define FOR(x,a,b) for (ll x=a;x<=b;x++)
  15. #define FOD(x,a,b) for (int x=a;x>=b;x--)
  16. #define REP(x,a,b) for (int x=a;x<b;x++)
  17. #define RED(x,a,b) for (int x=a;x>b;x--)
  18. #define EL cout<<endl
  19. #define maxn 1005
  20. #define vi vector<int>
  21. #define vii vector<vi>
  22. void init(){
  23.     freopen("NUMBER1.inp","r",stdin);
  24.     freopen("NUMBER1.out","w",stdout);
  25. }
  26. const int base = 1000000000;
  27. const int base_digits = 9;
  28. struct bigint {
  29.     vector<int> a;
  30.     int sign;
  31.     /*<arpa>*/
  32.     int size(){
  33.         if(a.empty())return 0;
  34.         int ans=(a.size()-1)*base_digits;
  35.         int ca=a.back();
  36.         while(ca)
  37.             ans++,ca/=10;
  38.         return ans;
  39.     }
  40.     bigint operator ^(const bigint &v){
  41.         bigint ans=1,a=*this,b=v;
  42.         while(!b.isZero()){
  43.             if(b%2)
  44.                 ans*=a;
  45.             a*=a,b/=2;
  46.         }
  47.         return ans;
  48.     }
  49.     string to_string(){
  50.         stringstream ss;
  51.         ss << *this;
  52.         string s;
  53.         ss >> s;
  54.         return s;
  55.     }
  56.     int sumof(){
  57.         string s = to_string();
  58.         int ans = 0;
  59.         for(int i=0,c=s[i];i<=sz(s);i++)  ans += c - '0';
  60.         return ans;
  61.     }
  62.     /*</arpa>*/
  63.     bigint() :
  64.         sign(1) {
  65.     }
  66.  
  67.     bigint(long long v) {
  68.         *this = v;
  69.     }
  70.  
  71.     bigint(const string &s) {
  72.         read(s);
  73.     }
  74.  
  75.     void operator=(const bigint &v) {
  76.         sign = v.sign;
  77.         a = v.a;
  78.     }
  79.  
  80.     void operator=(long long v) {
  81.         sign = 1;
  82.         a.clear();
  83.         if (v < 0)
  84.             sign = -1, v = -v;
  85.         for (; v > 0; v = v / base)
  86.             a.push_back(v % base);
  87.     }
  88.  
  89.     bigint operator+(const bigint &v) const {
  90.         if (sign == v.sign) {
  91.             bigint res = v;
  92.  
  93.             for (int i = 0, carry = 0; i < (int) max(a.size(), v.a.size()) || carry; ++i) {
  94.                 if (i == (int) res.a.size())
  95.                     res.a.push_back(0);
  96.                 res.a[i] += carry + (i < (int) a.size() ? a[i] : 0);
  97.                 carry = res.a[i] >= base;
  98.                 if (carry)
  99.                     res.a[i] -= base;
  100.             }
  101.             return res;
  102.         }
  103.         return *this - (-v);
  104.     }
  105.  
  106.     bigint operator-(const bigint &v) const {
  107.         if (sign == v.sign) {
  108.             if (abs() >= v.abs()) {
  109.                 bigint res = *this;
  110.                 for (int i = 0, carry = 0; i < (int) v.a.size() || carry; ++i) {
  111.                     res.a[i] -= carry + (i < (int) v.a.size() ? v.a[i] : 0);
  112.                     carry = res.a[i] < 0;
  113.                     if (carry)
  114.                         res.a[i] += base;
  115.                 }
  116.                 res.trim();
  117.                 return res;
  118.             }
  119.             return -(v - *this);
  120.         }
  121.         return *this + (-v);
  122.     }
  123.  
  124.     void operator*=(int v) {
  125.         if (v < 0)
  126.             sign = -sign, v = -v;
  127.         for (int i = 0, carry = 0; i < (int) a.size() || carry; ++i) {
  128.             if (i == (int) a.size())
  129.                 a.push_back(0);
  130.             long long cur = a[i] * (long long) v + carry;
  131.             carry = (int) (cur / base);
  132.             a[i] = (int) (cur % base);
  133.             //asm("divl %%ecx" : "=a"(carry), "=d"(a[i]) : "A"(cur), "c"(base));
  134.         }
  135.         trim();
  136.     }
  137.  
  138.     bigint operator*(int v) const {
  139.         bigint res = *this;
  140.         res *= v;
  141.         return res;
  142.     }
  143.  
  144.     void operator*=(long long v) {
  145.         if (v < 0)
  146.             sign = -sign, v = -v;
  147.         if(v > base){
  148.             *this = *this * (v / base) * base + *this * (v % base);
  149.             return ;
  150.         }
  151.         for (int i = 0, carry = 0; i < (int) a.size() || carry; ++i) {
  152.             if (i == (int) a.size())
  153.                 a.push_back(0);
  154.             long long cur = a[i] * (long long) v + carry;
  155.             carry = (int) (cur / base);
  156.             a[i] = (int) (cur % base);
  157.             //asm("divl %%ecx" : "=a"(carry), "=d"(a[i]) : "A"(cur), "c"(base));
  158.         }
  159.         trim();
  160.     }
  161.  
  162.     bigint operator*(long long v) const {
  163.         bigint res = *this;
  164.         res *= v;
  165.         return res;
  166.     }
  167.  
  168.     friend pair<bigint, bigint> divmod(const bigint &a1, const bigint &b1) {
  169.         int norm = base / (b1.a.back() + 1);
  170.         bigint a = a1.abs() * norm;
  171.         bigint b = b1.abs() * norm;
  172.         bigint q, r;
  173.         q.a.resize(a.a.size());
  174.  
  175.         for (int i = a.a.size() - 1; i >= 0; i--) {
  176.             r *= base;
  177.             r += a.a[i];
  178.             int s1 = r.a.size() <= b.a.size() ? 0 : r.a[b.a.size()];
  179.             int s2 = r.a.size() <= b.a.size() - 1 ? 0 : r.a[b.a.size() - 1];
  180.             int d = ((long long) base * s1 + s2) / b.a.back();
  181.             r -= b * d;
  182.             while (r < 0)
  183.                 r += b, --d;
  184.             q.a[i] = d;
  185.         }
  186.  
  187.         q.sign = a1.sign * b1.sign;
  188.         r.sign = a1.sign;
  189.         q.trim();
  190.         r.trim();
  191.         return make_pair(q, r / norm);
  192.     }
  193.  
  194.     bigint operator/(const bigint &v) const {
  195.         return divmod(*this, v).first;
  196.     }
  197.  
  198.     bigint operator%(const bigint &v) const {
  199.         return divmod(*this, v).second;
  200.     }
  201.  
  202.     void operator/=(int v) {
  203.         if (v < 0)
  204.             sign = -sign, v = -v;
  205.         for (int i = (int) a.size() - 1, rem = 0; i >= 0; --i) {
  206.             long long cur = a[i] + rem * (long long) base;
  207.             a[i] = (int) (cur / v);
  208.             rem = (int) (cur % v);
  209.         }
  210.         trim();
  211.     }
  212.  
  213.     bigint operator/(int v) const {
  214.         bigint res = *this;
  215.         res /= v;
  216.         return res;
  217.     }
  218.  
  219.     int operator%(int v) const {
  220.         if (v < 0)
  221.             v = -v;
  222.         int m = 0;
  223.         for (int i = a.size() - 1; i >= 0; --i)
  224.             m = (a[i] + m * (long long) base) % v;
  225.         return m * sign;
  226.     }
  227.  
  228.     void operator+=(const bigint &v) {
  229.         *this = *this + v;
  230.     }
  231.     void operator-=(const bigint &v) {
  232.         *this = *this - v;
  233.     }
  234.     void operator*=(const bigint &v) {
  235.         *this = *this * v;
  236.     }
  237.     void operator/=(const bigint &v) {
  238.         *this = *this / v;
  239.     }
  240.  
  241.     bool operator<(const bigint &v) const {
  242.         if (sign != v.sign)
  243.             return sign < v.sign;
  244.         if (a.size() != v.a.size())
  245.             return a.size() * sign < v.a.size() * v.sign;
  246.         for (int i = a.size() - 1; i >= 0; i--)
  247.             if (a[i] != v.a[i])
  248.                 return a[i] * sign < v.a[i] * sign;
  249.         return false;
  250.     }
  251.  
  252.     bool operator>(const bigint &v) const {
  253.         return v < *this;
  254.     }
  255.     bool operator<=(const bigint &v) const {
  256.         return !(v < *this);
  257.     }
  258.     bool operator>=(const bigint &v) const {
  259.         return !(*this < v);
  260.     }
  261.     bool operator==(const bigint &v) const {
  262.         return !(*this < v) && !(v < *this);
  263.     }
  264.     bool operator!=(const bigint &v) const {
  265.         return *this < v || v < *this;
  266.     }
  267.  
  268.     void trim() {
  269.         while (!a.empty() && !a.back())
  270.             a.pop_back();
  271.         if (a.empty())
  272.             sign = 1;
  273.     }
  274.  
  275.     bool isZero() const {
  276.         return a.empty() || (a.size() == 1 && !a[0]);
  277.     }
  278.  
  279.     bigint operator-() const {
  280.         bigint res = *this;
  281.         res.sign = -sign;
  282.         return res;
  283.     }
  284.  
  285.     bigint abs() const {
  286.         bigint res = *this;
  287.         res.sign *= res.sign;
  288.         return res;
  289.     }
  290.  
  291.     long long longValue() const {
  292.         long long res = 0;
  293.         for (int i = a.size() - 1; i >= 0; i--)
  294.             res = res * base + a[i];
  295.         return res * sign;
  296.     }
  297.  
  298.     friend bigint gcd(const bigint &a, const bigint &b) {
  299.         return b.isZero() ? a : gcd(b, a % b);
  300.     }
  301.     friend bigint lcm(const bigint &a, const bigint &b) {
  302.         return a / gcd(a, b) * b;
  303.     }
  304.  
  305.     void read(const string &s) {
  306.         sign = 1;
  307.         a.clear();
  308.         int pos = 0;
  309.         while (pos < (int) s.size() && (s[pos] == '-' || s[pos] == '+')) {
  310.             if (s[pos] == '-')
  311.                 sign = -sign;
  312.             ++pos;
  313.         }
  314.         for (int i = s.size() - 1; i >= pos; i -= base_digits) {
  315.             int x = 0;
  316.             for (int j = max(pos, i - base_digits + 1); j <= i; j++)
  317.                 x = x * 10 + s[j] - '0';
  318.             a.push_back(x);
  319.         }
  320.         trim();
  321.     }
  322.  
  323.     friend istream& operator>>(istream &stream, bigint &v) {
  324.         string s;
  325.         stream >> s;
  326.         v.read(s);
  327.         return stream;
  328.     }
  329.  
  330.     friend ostream& operator<<(ostream &stream, const bigint &v) {
  331.         if (v.sign == -1)
  332.             stream << '-';
  333.         stream << (v.a.empty() ? 0 : v.a.back());
  334.         for (int i = (int) v.a.size() - 2; i >= 0; --i)
  335.             stream << setw(base_digits) << setfill('0') << v.a[i];
  336.         return stream;
  337.     }
  338.  
  339.     static vector<int> convert_base(const vector<int> &a, int old_digits, int new_digits) {
  340.         vector<long long> p(max(old_digits, new_digits) + 1);
  341.         p[0] = 1;
  342.         for (int i = 1; i < (int) p.size(); i++)
  343.             p[i] = p[i - 1] * 10;
  344.         vector<int> res;
  345.         long long cur = 0;
  346.         int cur_digits = 0;
  347.         for (int i = 0; i < (int) a.size(); i++) {
  348.             cur += a[i] * p[cur_digits];
  349.             cur_digits += old_digits;
  350.             while (cur_digits >= new_digits) {
  351.                 res.push_back(int(cur % p[new_digits]));
  352.                 cur /= p[new_digits];
  353.                 cur_digits -= new_digits;
  354.             }
  355.         }
  356.         res.push_back((int) cur);
  357.         while (!res.empty() && !res.back())
  358.             res.pop_back();
  359.         return res;
  360.     }
  361.  
  362.     typedef vector<long long> vll;
  363.  
  364.     static vll karatsubaMultiply(const vll &a, const vll &b) {
  365.         int n = a.size();
  366.         vll res(n + n);
  367.         if (n <= 32) {
  368.             for (int i = 0; i < n; i++)
  369.                 for (int j = 0; j < n; j++)
  370.                     res[i + j] += a[i] * b[j];
  371.             return res;
  372.         }
  373.  
  374.         int k = n >> 1;
  375.         vll a1(a.begin(), a.begin() + k);
  376.         vll a2(a.begin() + k, a.end());
  377.         vll b1(b.begin(), b.begin() + k);
  378.         vll b2(b.begin() + k, b.end());
  379.  
  380.         vll a1b1 = karatsubaMultiply(a1, b1);
  381.         vll a2b2 = karatsubaMultiply(a2, b2);
  382.  
  383.         for (int i = 0; i < k; i++)
  384.             a2[i] += a1[i];
  385.         for (int i = 0; i < k; i++)
  386.             b2[i] += b1[i];
  387.  
  388.         vll r = karatsubaMultiply(a2, b2);
  389.         for (int i = 0; i < (int) a1b1.size(); i++)
  390.             r[i] -= a1b1[i];
  391.         for (int i = 0; i < (int) a2b2.size(); i++)
  392.             r[i] -= a2b2[i];
  393.  
  394.         for (int i = 0; i < (int) r.size(); i++)
  395.             res[i + k] += r[i];
  396.         for (int i = 0; i < (int) a1b1.size(); i++)
  397.             res[i] += a1b1[i];
  398.         for (int i = 0; i < (int) a2b2.size(); i++)
  399.             res[i + n] += a2b2[i];
  400.         return res;
  401.     }
  402.  
  403.     bigint operator*(const bigint &v) const {
  404.         vector<int> a6 = convert_base(this->a, base_digits, 6);
  405.         vector<int> b6 = convert_base(v.a, base_digits, 6);
  406.         vll a(a6.begin(), a6.end());
  407.         vll b(b6.begin(), b6.end());
  408.         while (a.size() < b.size())
  409.             a.push_back(0);
  410.         while (b.size() < a.size())
  411.             b.push_back(0);
  412.         while (a.size() & (a.size() - 1))
  413.             a.push_back(0), b.push_back(0);
  414.         vll c = karatsubaMultiply(a, b);
  415.         bigint res;
  416.         res.sign = sign * v.sign;
  417.         for (int i = 0, carry = 0; i < (int) c.size(); i++) {
  418.             long long cur = c[i] + carry;
  419.             res.a.push_back((int) (cur % 1000000));
  420.             carry = (int) (cur / 1000000);
  421.         }
  422.         res.a = convert_base(res.a, 6, base_digits);
  423.         res.trim();
  424.         return res;
  425.     }
  426. };
  427. ll xuli(ll n){
  428.     bigint res=0;
  429.     FOR(i,1,10000){
  430.         res= res*10+1;
  431.         if((res%n)==0){return i;}
  432.     }
  433. }
  434. ll n,k;
  435. int main(){
  436.     IO
  437.     init();
  438.     scanf("%lld",&k);
  439.     while(k--){
  440.         scanf("%lld",&n);
  441.         printf("%lld\n",xuli(n));
  442.     }
  443.     //cout<<"int binh[]=[";
  444.  
  445.  
  446.  
  447. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement