《算法竞赛进阶指南》0.1位运算

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 }

 

posted @ 2019-04-23 20:35  WMXNLFD  阅读(272)  评论(0编辑  收藏  举报