BNUOJ 51003 BQG's Confusing Sequence(二进制)

来源:互联网 发布:安卓新闻推荐 知乎 编辑:程序博客网 时间:2024/06/07 08:56

题意:

:=ab,a,b[0,9],ab
1n109,109+7

分析:

a,b0,,0
sum[i]:=1i
nk,1i1
0,

代码:

////  Created by TaoSama on 2015-12-26//  Copyright (c) 2015 TaoSama. All rights reserved.////#pragma comment(linker, "/STACK:1024000000,1024000000")#include <algorithm>#include <cctype>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iomanip>#include <iostream>#include <map>#include <queue>#include <string>#include <set>#include <vector>using namespace std;#define pr(x) cout << #x << " = " << x << "  "#define prln(x) cout << #x << " = " << x << endlconst int N = 1e6 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;typedef long long LL;LL a, b, n;LL digit[50], sum[50];int main() {#ifdef LOCAL    freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin);//  freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout);#endif//    ios_base::sync_with_stdio(0);    int t; scanf("%d", &t);    while(t--) {        scanf("%lld%lld%lld", &a, &b, &n);        if(a > b) swap(a, b);        if(a) --n;        for(int i = 1; i <= 40; ++i)            sum[i] = (1LL << i) - (a ? 0 : (1LL << i - 1));        int k;        for(int i = 1; i <= 40; ++i) {            sum[i] += sum[i - 1];//          prln(sum[i]);            if(sum[i] > n) {k = i; break;}        }        if(a) n -= sum[k - 1];//      pr(k); prln(n);        int cnt = 0;        memset(digit, 0, sizeof digit);        for(; n; n >>= 1) digit[++cnt] = n & 1;        reverse(digit + 1, digit + k + 1);        LL ans = 0;        for(int i = 1; i <= k; ++i) {//          prln(digit[i]);            ans = (ans * 10 + (digit[i] ? b : a)) % MOD;        }        printf("%lld\n", ans);    }    return 0;}

,debug,
Q6,
,

Q神代码:

#include<cstdio>  #include<cstring>  #include<cstdlib>  #include<cmath>  #include<iostream>  #include<algorithm>  using namespace std;  typedef long long ll;  const ll Mod=1000000007LL;  int ty[55];  int main()  {      int T;      scanf("%d",&T);      while(T--)      {          int a,b,n;          scanf("%d%d%d",&a,&b,&n);          if(a>b)swap(a,b);          if(a)n++;          int loc=0;          while(n)          {              ty[loc++]=n&1;              n>>=1;          }          ll res=0LL;          for(int i=loc-1-(a>0);i>=0;i--)              res=(res*10+(ty[i] ? b : a))%Mod;          printf("%lld\n",res);      }      return 0;  }  
0 1
原创粉丝点击