Bestcoder Round# 80

[1003 Sequence]

指数循环节,注意a mod p = 0的情况。此时你的循环节如果返回0,这时你会输出1,而实际上应该是0

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

typedef long long ll;
ll n, a, b, c, p;

struct Matrix{
    ll a[3][3];
    void clear(){memset(a, 0, sizeof a);}
    void set(){clear(); a[0][0] = a[1][1] = a[2][2] = 1;}
}mat, ans;

Matrix operator * (const Matrix& a, const Matrix& b){
    Matrix c; c.clear();
    for(int i = 0; i < 3; i ++)
        for(int j = 0; j < 3; j ++)
            for(int k = 0; k < 3; k ++)
                (c.a[i][j] += a.a[i][k] * b.a[k][j]) %= (p-1);
    return c;
}

Matrix power(Matrix a, ll b){
    Matrix ret; ret.set();
    while(b > 0){
        if(b & 1)ret = ret * a;
        b >>= 1;
        a = a * a;
    }return ret;
}

ll power_mod(ll a, ll b){
    ll ret = 1;
    while(b > 0){
        if(b & 1)ret = ret * a % p;
        b >>= 1;
        a = a * a % p;
    }return ret;
}

int main(){
    int test;
    scanf("%d", &test);
    while(test --){
        cin >> n >> a >> b >> c >> p;
        if(n == 1){
            cout << 1 % p << endl;
            continue;
        }
        if(a % p == 0){
            cout << 0 << endl;
            continue;
        }
        mat.clear();
        mat.a[0][0] = c, mat.a[1][0] = 1, mat.a[2][0] = b;
        mat.a[0][1] = 1;
        mat.a[2][2] = 1;
        ans.clear();
        ans.a[0][0] = b, ans.a[0][1] = 0, ans.a[0][2] = 1;
        ans = ans * power(mat, n - 2);
        cout << power_mod(a, ans.a[0][0]) << endl;
    }
    return 0;
}

  

[1005 Road]

建立两棵线段树跑分层图(据说要Dijkstra+Heap?)。注意第二棵的叶子节点向第一棵的叶子节点连边。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#define maxn 800010
using namespace std;
int n, m, k;
struct Edge{
	int to, next, dis;
}edge[maxn << 2];
int h[maxn], cnt, S, T, posT;
void add(int u, int v, int d){
	cnt ++;
	edge[cnt].to = v;
	edge[cnt].next = h[u];
	edge[cnt].dis = d;
	h[u] = cnt;
}

vector<int> v1, v2;
#define lc (id << 1)
#define rc (id << 1 | 1)

void build(int id, int l, int r){
	if(l == r){
		if(l == 1)S = id;
		posT = max(posT, id);
		return;
	}
	int mid = l + r >> 1;
	build(lc, l, mid);
	build(rc, mid+1, r);
	add(lc, id, 0);
	add(rc, id, 0);
}

void build2(int id, int l, int r){
	if(l == r){
		add(id + posT, id, 0);
		if(l == n)T = id + posT;
		return;
	}
	int mid = l + r >> 1;
	build2(lc, l, mid);
	build2(rc, mid+1, r);
	add(id + posT, lc + posT, 0);
	add(id + posT, rc + posT, 0);
}

void ask1(int id, int l, int r, int L, int R){
	if(l == L && r == R){
		v1.push_back(id);
		return;
	}
	int mid = l + r >> 1;
	if(R <= mid)ask1(lc, l, mid, L, R);
	else if(L > mid)ask1(rc, mid+1, r, L, R);
	else ask1(lc, l, mid, L, mid), ask1(rc, mid+1, r, mid+1, R);
}

void ask2(int id, int l, int r, int L, int R){
	if(l == L && r == R){
		v2.push_back(id);
		return;
	}
	int mid = l + r >> 1;
	if(R <= mid)ask2(lc, l, mid, L, R);
	else if(L > mid)ask2(rc, mid+1, r, L, R);
	else ask2(lc, l, mid, L, mid), ask2(rc, mid+1, r, mid+1, R);
}

queue<pair<int, int> > Q;
int dis[maxn][11];
bool vis[maxn][11];

int main(){
	int test;
	scanf("%d", &test);
	scanf("%d%d%d", &n, &m, &k);
	build(1, 1, n);
	build2(1, 1, n);
	int a, b, c, d, w, tot = posT << 1;
	for(int i = 1; i <= m; i ++){
		scanf("%d%d%d%d%d", &a, &b, &c, &d, &w);
		v1.clear(), v2.clear();
		ask1(1, 1, n, a, b);
		ask2(1, 1, n, c, d);
		++ tot;
		for(int j = 0; j < v1.size(); j ++) add(v1[j], tot, 0);
		for(int j = 0; j < v2.size(); j ++) add(tot, v2[j] + posT, w);

		++ tot;
		for(int j = 0; j < v2.size(); j ++) add(v2[j], tot, 0);
		for(int j = 0; j < v1.size(); j ++)	add(tot, v1[j] + posT, w);
	}

	memset(dis, 0x7f, sizeof dis);
	Q.push(make_pair(S, 0)); dis[S][0] = 0;
	while(!Q.empty()){
		int u = Q.front().first, k_ = Q.front().second;
		Q.pop(); vis[u][k_] = false;
		for(int i = h[u]; i; i = edge[i].next){
			int v = edge[i].to;
			if(dis[v][k_] > dis[u][k_] + edge[i].dis){
				dis[v][k_] = dis[u][k_] + edge[i].dis;
				if(!vis[v][k_])vis[v][k_] = true, Q.push(make_pair(v, k_));
			}
			if(k_ < k && dis[v][k_+1] > dis[u][k_]){
				dis[v][k_+1] = dis[u][k_];
				if(!vis[v][k_+1])vis[v][k_+1] = true, Q.push(make_pair(v, k_+1));
			}
		}
	}

	int ans = 0x7fffffff;
	for(int i = 0; i <= k; i ++)
	    ans = min(ans, dis[T][i]);
	if(ans > 1e8)printf("CreationAugust is a sb!");
	else printf("%d\n", ans);
	return 0;
}

  

时间: 2024-12-28 01:12:55

Bestcoder Round# 80的相关文章

HDU 5666 Segment——BestCoder Round #80

Segment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 0    Accepted Submission(s): 0 Problem Description Silen August does not like to talk with others.She like to find some interesting probl

BestCoder Round #80 1004 hdu 5668 中国剩余定理(m不互质版)

链接:戳这里 Circle Time Limit: 2000/1000 MS (Java/Others)   Memory Limit: 65536/65536 K (Java/Others) 问题描述 \ \ \ \     Fye对约瑟夫游戏十分着迷. \ \ \ \     她找到了n个同学,把他们围成一个圈,让他们做约瑟夫游戏,然后她得到了一个同学们出圈的编号序列.游戏是这样进行的:以同学1为起点,开始计数,计数到第k个同学,该同学出圈.出圈的同学将不参与之后的计数. \ \ \ \  

BestCoder Round #80 待填坑

Lucky Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1443    Accepted Submission(s): 767 Problem Description Chaos August likes to study the lucky numbers. For a set of numbers S,we set the min

hdu 4956 Poor Hanamichi BestCoder Round #5(数学题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4956 Poor Hanamichi Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7    Accepted Submission(s): 4 Problem Description Hanamichi is taking part in

BestCoder Round #4 前两题 hdu 4931 4932

第一题太水了.. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int a[6]; 7 int main(){ 8 int cas; 9 scanf( "%d", &cas ); 10 while( cas-- ){ 11 for( int i = 0; i <

从lca到树链剖分 bestcoder round#45 1003

bestcoder round#45 1003 题,给定两个点,要我们求这两个点的树上路径所经过的点的权值是否出现过奇数次.如果是一般人,那么就是用lca求树上路径,然后判断是否出现过奇数次(用异或),高手就不这么做了,直接树链剖分.为什么不能用lca,因为如果有树退化成链,那么每次询问的复杂度是O(n), 那么q次询问的时间复杂度是O(qn) 什么是树链剖分呢? 就是把树的边分成轻链和重链 http://blogsina.com.cn/s/blog_6974c8b20100zc61.htmlh

hdu 5195 DZY Loves Topological Sorting BestCoder Round #35 1002 [ 拓扑排序 + 优先队列 || 线段树 ]

传送门 DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 221    Accepted Submission(s): 52 Problem Description A topological sort or topological ordering of a directed

计算几何(水)BestCoder Round #50 (div.2) 1002 Run

题目传送门 1 /* 2 好吧,我不是地球人,这题只要判断正方形就行了,正三角形和正五边形和正六边形都不可能(点是整数). 3 但是,如果不是整数,那么该怎么做呢?是否就此开启计算几何专题了呢 4 */ 5 /************************************************ 6 * Author :Running_Time 7 * Created Time :2015-8-8 19:54:14 8 * File Name :B.cpp 9 ************

BestCoder Round #29 1003 (hdu 5172) GTY&#39;s gay friends [线段树 判不同 预处理 好题]

传送门 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 264    Accepted Submission(s): 57 Problem Description GTY has n gay friends. To manage them conveniently, every morning he o