89. a^b
求 a 的 b 次方对 p取模的值。
输入格式
三个整数 a,b,p,在同一行用空格隔开。
输出格式
输出一个整数,表示a^b mod p的值。
数据范围
1≤a,b,p≤109
输入样例:
3 2 7
输出样例:
2
1 #include<iostream> 2 using namespace std; 3 4 //考察快速幂 5 int main() 6 { 7 int a, b, p; 8 cin >> a >> b >> p; 9 int res = 1 % p; 10 while(b) 11 { 12 if(b & 1) res = res * 1ll * a % p; 13 a = a * 1ll * a % p; 14 b >>= 1; //去掉个位 15 } 16 cout << res << endl; 17 return 0; 18 }
90. 64位整数乘法
求 a 乘 b 对 p 取模的值。
输入格式
第一行输入整数a,第二行输入整数b,第三行输入整数p。
输出格式
输出一个整数,表示a*b mod p的值。
数据范围
1≤a,b,p≤1018
输入样例:
3
4
5
输出样例:
2
1 #include<iostream> 2 using namespace std; 3 typedef unsigned long long ULL; 4 5 int main() 6 { 7 ULL a, b, p; 8 cin >> a >> b >> p; 9 ULL res = 0; 10 while(b) 11 { 12 if(b & 1) res = (res + a) % p; 13 a = a *2 % p; 14 b >>= 1; 15 } 16 cout << res << endl; 17 return 0; 18 }
91. 最短Hamilton路径
给定一张 n个点的带权无向图,点从 0~n-1 标号,求起点0到终点n-1的最短Hamilton路径。 Hamilton路径的定义是从0到n-1不重不漏地经过每个点恰好一次。
输入格式
第一行输入整数n。
接下来n行每行n个整数,其中第i行第j个整数表示点i到j的距离(记为a[i,j])。
对于任意的x,y,z,数据保证 a[x,x]=0,a[x,y]=a[y,x] 并且 a[x,y]+a[y,z]>=a[x,z]。
输出格式
输出一个整数,表示最短Hamilton路径的长度。
数据范围
1≤n≤20
0≤a[i,j]≤107
输入样例:
5
0 2 4 5 1
2 0 6 5 3
4 6 0 8 3
5 5 8 0 5
1 3 3 5 0
输出样例:
18
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 5 using namespace std; 6 7 const int N = 20, M = 1 << 20; // M = 2^n 8 9 int n; //多少个点 10 int f[M][N],weight[N][N]; //M表示点的状态,M表示处在那一个点,weight表示点和电之间的加权和 11 12 int main() 13 { 14 cin >> n; 15 for(int i = 0; i < n; i++) 16 for(int j = 0; j < n; j++) 17 cin >> weight[i][j]; 18 19 memset(f, 0x3f, sizeof(f)); //初始化正无穷 20 f[1][0] = 0; //初始化,经过0,处于起点0,最短长度为0 21 22 for(int i = 1; i < 1 << n; i++) 23 for(int j = 0; j < n; j++) 24 if(i >> j & 1) //检查第j位是不是1 25 for(int k = 0; k < n; k++) 26 if( i - (1 << j) >> k & 1) 27 f[i][j] = min( f[i][j], f[i - (1 << j)][k] + weight[k][j] ); 28 29 cout << f[(1 << n) - 1][n - 1] << endl; 30 return 0; 31 }