89.a^b
#include<iostream>
using namespace std;
int main(){
int a , b , p;
cin >> a >> b >> p;
int res = 1 % p;//去掉b为0的情况
while(b){
if(b & 1) res = res * 1ll * a % p;//位运算,化为二进制,如果最低位为一,就把乘积项累积
a = a * 1ll * a % p ;//累积
b >>= 1; //右移一位
}
cout << res << endl ;
}
90.64位整数除法
法一(类似快速幂):
#include<iostream>
using namespace std;
typedef long long ull; //typedef 改名
int main(){
ull a , b , p;
cin >> a >> b >> p;
ull res = 0;
while(b){
if(b & 1) res = (res + a) % p;//位运算,化为二进制,如果最低位为一,就+a
a = a * 2 % p ;
b >>= 1;
}
cout << res << endl ;
}
法二(a * b mod p = a * b - ⌊a * b / p⌋ * p)⌊⌋表示向下取整:(该方法各数制转换我不懂)
#include<iostream>
using namespace std;
typedef long long ull; //typedef 改名
int main(){
ull a , b , p;
cin >> a >> b >> p;
a %= p ;
b %= p ;//当a,b在0~p之间时可省略
ull c = (long double)a * b / p;
long long x = (long long)a * b % p - (long long)c * p % p;
if(x < 0) x += p ;
cout << x << endl ;
}
91.最短Hamilton路径(状态压缩):
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
const int N = 20 , M = 1 << 20 ;
int n ;
int f[M][N];
int fight[N][N];
int main(){
memset( f, 0x3f, sizeof(f));
cin >> n;
f[1][0] = 0;
for(int i = 0 ; i < n ; i++ )
for(int j = 0 ; j < n ; j++ )
cin >> fight[i][j];
for(int i = 0 ; i< 1 << n ; i++ )
for(int j = 0 ; j < n ; j++ )
if( i >> j & 1 )
for(int k = 0 ; k < n ; k++ )
if( i - (1 << j) >> k & 1 )
f[i][j] = min(f[i][j] , f[i - (1 << j)][k] + fight[k][j]);
cout << f[(1 << n) - 1][n - 1] << endl;
}
998.起床困难综合症:
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<utility>
using namespace std;
int n , m;
pair<string,int> a[100010];
int calc(int bit , int now){
for(int i = 1; i <= n; i++ ){
int x = a[i].second >> bit & 1;
if(a[i].first == "AND") now &= x;
else if(a[i].first == "OR") now |= x;
else now ^= x;
}
return now;
}
int main(){
cin >> n >> m;
// string str;
// int num;
for(int i = 1 ; i <= n ; i++ ){
cin >> a[i].first >> a[i].second;
}
int res0 = 0;
int res1 = 0;
int val = 0;
int ans = 0;
for(int bit = 29 ; bit >= 0 ; bit-- ){
res0 = calc(bit,0);
res1 = calc(bit,1);
if( val + (1 << bit) <= m && res0 < res1){
val += 1 << bit;
ans += res1 << bit;
}
else ans += res0 << bit;
}
cout << ans << endl;
}