《算法竞赛进阶指南》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 }

 

转载于:https://www.cnblogs.com/wmxnlfd/p/10758719.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值