2居然不需要考虑大数??? 不过大数也AC了。。。主办方真的是。。神奇 #include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #include <string> #include <math.h> #include <stack> #include <queue> #include <vector> #include <map> #include <set> #include <cmath> #pragma warning(disable:4996) #define Zero(a) memset(a, 0, sizeof(a)) #define Neg(a)  memset(a, -1, sizeof(a)) #define All(a) a.begin(), a.end() #define PB push_back #define repf(i,a,b) for(i = a;i <= b; i++) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define root 1,n,1 #define ld rt << 1 #define rd rt << 1 | 1 #define ll long long #define MAXN 100100 #define INF 6666666 #define mod 1000000007 #define ll long long #define sqrtt(x) (ll)(x)*(x) #define dist(x1,y1,x2,y2) (sqrtt(x1-x2)+sqrtt(y1-y2)) using namespace std; ll x, y; ll k; int T; int yess[130]; vector<int>rec; string Sum(string s1, string s2) {     if (s1.length() < s2.length())     {         string temp = s1;         s1 = s2;         s2 = temp;     }     int i, j;     for (i = s1.length() - 1, j = s2.length() - 1; i >= 0; i--, j--)     {         s1[i] = char(s1[i] + (j >= 0 ? s2[j] - '0' : 0));           if (s1[i] - '0' >= 10)         {             s1[i] = char((s1[i] - '0') % 10 + '0');             if (i) s1[i - 1]++;             else s1 = '1' + s1;         }     }     return s1; } ll multt(ll m, ll n) {     ll ans = 1;     for (int i = 0; i < n; ++i)         ans *= m;     return ans; } string Multiply(string s, int x)  //大数乘以整形数 {     reverse(s.begin(), s.end());     int cmp = 0;     for (int i = 0; i < s.size(); i++)     {         cmp = (s[i] - '0')*x + cmp;         s[i] = (cmp % 10 + '0');         cmp /= 10;     }     while (cmp)     {         s += (cmp % 10 + '0');         cmp /= 10;     }     reverse(s.begin(), s.end());     return s; } struct node {     int val;     int pos; }; vector<node>nd; int main() {     while (cin >> T) {         while (T--) {             cin >> x >> k;             rec.clear();             for (int i = 0; i < 130; ++i)                 yess[i] = 1;             ll tt = 0;             int stp = 0;             while (tt <= x) {                 if (multt(2, stp) & x) {                     yess[stp] = 0;                 }                 tt += multt(2, stp);                 stp++;             }             nd.clear();             int cnt = 0;             for (int i = 0; i < 130; ++i) {                 node kk;                 if (yess[i] == 1) {                     kk.pos = 1;                     kk.val = i;                     nd.push_back(kk);                 }             }             //cout << nd.size() << endl;             stp = 0;             tt = 0;             while (stp < nd.size()) {                 if ((multt(2, stp) & k) && tt <= k) {                     nd[stp].pos = 1;                 }                 else {                     nd[stp].pos = 0;                 }                 tt += multt(2, stp);                 stp++;             }             vector<node>ndd;             for (int i = 0; i < nd.size(); ++i) {                 if (nd[i].pos == 1)                     ndd.push_back(nd[i]);             }             string ans = "0";             for (int i = 0; i < ndd.size(); ++i) {                 string anss = "1";                 for (int j = 0; j < ndd[i].val; ++j)                     anss = Multiply(anss, 2);                 //cout << anss << endl;                 ans = Sum(ans, anss);             }             cout << ans << endl;         }     }     return 0; }
点赞 5
牛客网
牛客企业服务