Modular Exponentiation
The following problem is well-known: given integers n and m, calculate
where 2n = 2·2·...·2 (n factors), and denotes the remainder of division of x by y.
You are asked to solve the "reverse" problem. Given integers n and m, calculate
Input
The first line contains a single integer n (1 ≤ n ≤ 108).
The second line contains a single integer m (1 ≤ m ≤ 108).
OutputOutput a single integer — the value of .
Examples4 42
10
1 58
0
98765432 23456789
23456789
In the first example, the remainder of division of 42 by 24 = 16 is equal to 10.
In the second example, 58 is divisible by 21 = 2 without remainder, and the answer is 0.
这个题如果2^n大于m就停止,输出m,否则输出m%2^n,本来这个过程想用快速幂写,结果不知道为什么老是运行时错误,后来发现因为不会2^n不会超过1e8所以直接暴力乘就可以
code:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
int n,m;
int main(){
scanf("%d%d",&n,&m);
ll ans = 1LL;
int flag = 1;
for(int i = 1; i <= n; i++){
ans *= 2LL;
if(ans > m){
flag = 0;
break;
}
}
if(!flag) printf("%d\n",m);
else printf("%d\n",m%ans);
return 0;
}