concatenate binary of first N integers and return decimal value

后端 未结 2 1477
日久生厌
日久生厌 2020-12-22 09:07

Example,

N = 3 The first N integers for value 3 is 1, 2, 3

Binary

相关标签:
2条回答
  • Note that working with string representation is not necessary (moreover, is not useful after task changing). Look at approach with bitwise arithmetics (Python, but principle is the same)

    With new condition concerning modulo 1000000007 we have just add modulo operation to result calculation line at every step, because shift left and or-ing is equivalent to multiplication by power of two and adding, these operations are obeyed to equivalence relations for modulo properties. Note that intermediate results don't exceed 1000000007*n, so long type is suitable here for reasonable n values.

    n = 100  
    size = 0   #bit length of addends
    result = 0   # long accumulator
    for i in range(1, n + 1):    
        if i & (i - 1) == 0:    #for powers of two we increase bit length
            size += 1
        result = ((result << size) | i) % 1000000007   #shift accumulator left and fill low bits with new addend
    print(result)
    

    variant without bitwise operations:

    pow2 = 1
    nextpow = 2
    result = 0   # long accumulator
    for i in range(1, n + 1):
        if i == nextpow:    #for powers of two we increase bit length
            pow2 = nextpow
            nextpow = nextpow * 2
        result = (result * pow2  + i) % 1000000007  #shift accumulator left and fill low bits with new addend
    
    0 讨论(0)
  • 2020-12-22 09:40
        cin>>n;
        ll ans=1;
        ll one=1;
        for(int i=2;i<=n;i++)
        {
            ll digit=log2(i)+1;
            ans=(((ans%N*(one<<digit)%N)%N+i%N)%N);
        }
        cout<<ans<<Ed;
    
    0 讨论(0)
提交回复
热议问题