HDU 2254 奥运(数论+矩阵)
来源:互联网 发布:电梯司机模拟考试软件 编辑:程序博客网 时间:2024/05/05 08:43
题目中文的不解释啊。。。
需要注意的就是:离散数学中,有向图的邻接矩阵A表示所有点之间路径长度为1的路径数量,A^n则表示路径长度为n的路径数量,故需要求某两点在(A^t1)~(A^t2)的路径数量之和。
奥运
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2251 Accepted Submission(s): 572
Problem Description
北京迎来了第一个奥运会,我们的欢呼声响彻中国大地,所以今年的奥运金牌 day day up!
比尔盖兹坐上鸟巢里,手里摇着小纸扇,看的不亦乐乎,被俺们健儿的顽强拼搏的精神深深的感动了。反正我的钱也多的没地方放了,他对自己说,我自己也来举办一个奥运会,看谁的更火。不过他的奥运会很特别:
1 参加人员必须是中国人;
2 至少会加法运算(因为要计算本人获得的金牌数)
他知道中国有很多的名胜古迹,他知道自己在t1 到 t2天内不可能把所有的地方都玩遍,所以他决定指定两个地方v1,v2,如果参赛员能计算出在t1到t2天(包括t1,t2)内从v1到v2共有多少种走法(每条道路走需要花一天的时间,且不能在某个城市停留,且t1=0时的走法数为0),那么他就会获得相应数量的金牌,城市的总数<=30,两个城市间可以有多条道路
,每条都视为是不同的。
比尔盖兹坐上鸟巢里,手里摇着小纸扇,看的不亦乐乎,被俺们健儿的顽强拼搏的精神深深的感动了。反正我的钱也多的没地方放了,他对自己说,我自己也来举办一个奥运会,看谁的更火。不过他的奥运会很特别:
1 参加人员必须是中国人;
2 至少会加法运算(因为要计算本人获得的金牌数)
他知道中国有很多的名胜古迹,他知道自己在t1 到 t2天内不可能把所有的地方都玩遍,所以他决定指定两个地方v1,v2,如果参赛员能计算出在t1到t2天(包括t1,t2)内从v1到v2共有多少种走法(每条道路走需要花一天的时间,且不能在某个城市停留,且t1=0时的走法数为0),那么他就会获得相应数量的金牌,城市的总数<=30,两个城市间可以有多条道路
,每条都视为是不同的。
Input
本题多个case,每个case:
输入一个数字n表示有n条道路 0<n<10000
接下来n行每行读入两个数字 p1,p2 表示城市p1到p2有道路,并不表示p2到p1有道路 (0<=p1,p2<2^32)
输入一个数字k表示有k个参赛人员
接下来k行,每行读入四个数据v1,v2,t1,t2 (0<=t1,t2<10000)
输入一个数字n表示有n条道路 0<n<10000
接下来n行每行读入两个数字 p1,p2 表示城市p1到p2有道路,并不表示p2到p1有道路 (0<=p1,p2<2^32)
输入一个数字k表示有k个参赛人员
接下来k行,每行读入四个数据v1,v2,t1,t2 (0<=t1,t2<10000)
Output
对于每组数据中的每个参赛人员输出一个整数表示他获得的金牌数(mod 2008)
Sample Input
61 21 32 33 23 12 131 2 0 01 2 1 1004 8 3 50
Sample Output
015060
</pre><pre style="font-family: 'Courier New'; background-color: rgb(244, 251, 255);"><pre name="code" class="cpp">#include <algorithm>#include <iostream>#include <stdlib.h>#include <string.h>#include <iomanip>#include <stdio.h>#include <string>#include <queue>#include <cmath>#include <stack>#include <map>#include <set>#define eps 1e-10///#define M 1000100#define LL __int64///#define LL long long///#define INF 0x7ffffff#define INF 0x3f3f3f3f#define PI 3.1415926535898#define zero(x) ((fabs(x)<eps)?0:x)#define mod 2008const int maxn = 210;using namespace std;struct matrix{ int f[31][31];};matrix p[10001];map<int, int>mp;matrix mul(matrix a, matrix b, int n){ matrix c; memset(c.f, 0, sizeof(c.f)); for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { for(int k = 0; k < n; k++) c.f[i][j] += a.f[i][k]*b.f[k][j]; c.f[i][j] %= mod; } } return c;}matrix pow_mod(matrix a, int b, int n){ matrix s; memset(s.f, 0 , sizeof(s.f)); for(int i = 0; i < n; i++) s.f[i][i] = 1; while(b) { if(b&1) s = mul(s, a, n); a = mul(a, a, n); b >>= 1; } return s;}matrix Add(matrix a,matrix b, int n) { matrix c; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { c.f[i][j] = a.f[i][j]+b.f[i][j]; c.f[i][j] %= mod; } } return c;}int main(){ int n, m; while(scanf("%d",&n)!=EOF) { int u, v; int ans = 0; mp.clear(); memset(p[0].f, 0, sizeof(p[0].f)); for(int i = 0; i < n; i++) { scanf("%d %d",&u, &v); if(mp.find(u) == mp.end()) mp[u] = ans++; if(mp.find(v) == mp.end()) mp[v] = ans++; p[0].f[mp[u]][mp[v]] ++; } for(int i = 1; i < 10001; i++) p[i] = mul(p[i-1], p[0], ans); scanf("%d",&m); int t1, t2, v1, v2; while(m--) { scanf("%d %d %d %d",&v1, &v2, &t1, &t2); if(t1 > t2) swap(t1,t2); if(mp.find(v1) == mp.end() || mp.find(v2) == mp.end() || t1 == 0 && t2 == 0) { puts("0"); continue; } int sum = 0; for(int i = t1-1; i < t2; i++) { if(i == -1) continue; sum += p[i].f[mp[v1]][mp[v2]]%mod; } printf("%d\n",sum%mod); ///cout<<(sum%mod)<<endl; } } return 0;}
0 0
- HDU 2254 奥运(数论+矩阵)
- Hdu 2254 奥运 (矩阵)
- HDU 2254 奥运(矩阵)
- hdu 2254 奥运(矩阵快速幂)
- HDU 2254(数论,矩阵)
- HDU 2254 奥运 矩阵应用
- hdu 2254 奥运(矩阵降幂+二分求和)
- hdu 2254 奥运(矩阵 感觉挺难的)
- HDU 1757(数论,矩阵)
- hdu 奥运(矩阵快速幂+等比数列快速求和+数论)
- HDU 2254 奥运(矩阵快速幂+二分等比序列求和)
- HDU 2254-奥运(有向图的邻接矩阵+矩阵乘法)
- hdu 2254 奥运 矩阵求路径方案数
- HDU 2276(数论,构造二分矩阵)
- HDU 2842(数论,构造矩阵)
- HDU 2256(数论,构造二分矩阵)
- HDU 2971(数论,构造矩阵+矩阵乘法优化)
- HDU 2855(数论,构造矩阵+矩阵乘法)
- 刘星:HBase性能深度分析
- Android.mk高级写法
- *linux下数据库的访问与控制*
- Yahoo的Yslow23条规则
- CSS定位
- HDU 2254 奥运(数论+矩阵)
- junit入门
- 《数据结构》实验一:VC编程环境灵活应用
- Java利用Zxing生成二维码
- 银行家算法
- m个珠子共n种颜色,找出包含n种颜色的最短连续片段(百度面试题)
- iOS 自动释放手动释放混编
- Java中的集合
- QT triggered与toggled