快速幂详解[二进制][十进制]+模板

xxx

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cstdio>
#include <vector>
#include <bitset>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <set>
#include <map>

#define  endc       std::ios::sync_with_stdio(false); // 关掉c++流
#define  INOPEN     freopen("in.txt", "r", stdin)
#define  OUTOPEN    freopen("out.txt", "w", stdout)
#define  mes(a, b)  memset(a, b, sizeof(a))
#define  isdigit(a) ((a)>=‘0‘&&(a)<=‘9‘)
#define  xiao(a)    (a)>=‘a‘&&(a)<=‘z‘
#define  da(a)      (a)>=‘A‘&&(a)<=‘Z‘
#define  pii        pair<int, int>
#define  lowbit(x)  x & (-x)
#define  fi         first
#define  se         second
#define  lson       id<<1
#define  rson       id<<1|1

typedef unsigned long long int ull;
typedef long long int ll;
const double eps  = 1e-8;
const double pi   = acos(-1.0);
const int    inf  = 0x3f3f3f3f;
const ll     INF  = 1e18 + 8;
const int    maxm = 2e5 + 6;
const int    maxn = 2e5 + 10;
const int    mod  = 100000009;
using namespace std;

inline int read() {
    int x = 0, f = 1; char ch = getchar();
    while(!isdigit(ch)){if(ch == ‘-‘) f = -f; ch = getchar();}
    while(isdigit(ch)){x = (x<<3)+(x<<1)+ch-‘0‘; ch = getchar();}
    return x * f;
}

struct node {
    int v, next; ll w;
    node() {}
    node(int v, int n, ll w) : v(v), next(n), w(w) {}
}edge[maxm << 1];
ll dis[maxn], a[maxn];
int head[maxn];
bool vis[maxn];
int tol, n;

void add(int u, int v, ll w) {
    edge[tol] = node(v, head[u], w);  head[u] = tol++;
}

void init() {
    tol = 0;
    mes(head, -1);  mes(vis, false);
    for(int i = 0; i < maxn; ++i)   dis[i] = INF;
}

ll spfa(int s, int t) {
    queue<int> q;
    while(!q.empty()) q.pop();
    dis[s] = 0, vis[s] = true;
    q.push(s);
    while(!q.empty()) {
        int u = q.front(); q.pop();
        vis[u] = false;
        for(int i = head[u]; ~i; i = edge[i].next) {
            node &e = edge[i];
            if(dis[e.v] > dis[u] + e.w) {
                dis[e.v] = dis[u] + e.w;
                if(vis[e.v])    continue;
                vis[e.v] = true;
                q.push(e.v);
            }
        }
    }
    return dis[t];
}

int main() {
    int T;
    // INOPEN;
    // OUTOPEN;
    scanf("%d", &T);
    while(T--) {
        init();
        int n, m, u, v; ll w;
        scanf("%d%d", &n, &m);
        for(int i = 1; i <= n; ++i) scanf("%lld", &a[i]);
        while(m --) {
            scanf("%d%d%lld", &u, &v, &w);
            add(u, v, w);
            add(v, u, w);
        }
        spfa(1, n);
        ll ans = 0; int flag = 0;
        for(int i = 2; i <= n; ++i) {
            if(dis[i] == INF) {
                flag = 1;
                break;
            }
            ans += dis[i] * a[i];
        }
        if(flag)    printf("No Answer\n");
        else        printf("%lld\n", ans);
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/Guugle/p/11781277.html

时间: 2024-11-09 00:02:36

快速幂详解[二进制][十进制]+模板的相关文章

HDU 5318 The Goddess Of The Moon(矩阵快速幂详解)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5318 题面: The Goddess Of The Moon Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 800    Accepted Submission(s): 349 Problem Description Chang'e (嫦

缓存DNS服务器和主DNS服务器的快速搭建详解

缓存DNS服务器和主DNS服务器的快速搭建详解 一.设定配置内容假设我们已经在网上注册了wangej.com域名,得到的IP网络是172.16.12.0/24ns服务器是:172.16.12.1www服务器:172.16.12.1,另外一个地址:172.16.12.3mail服务器:172.16.12.2ftp主机在www服务器上,即ftp为www的别名 二.准备工作:这里我们使用bind97来搭建我们的DNS服务器,首先需要安装好bind97.i386.bind97-libs.i386.bin

Myeclipse Templates详解(一) —— Java模板基础

目录 Templates简介 MyEclipse自带Templates详解 新建Template 自定义Template 因为自己比较懒,尤其是对敲重复代码比较厌恶,所以经常喜欢用快捷键和模板,Myeclipse的模板功能其实很强大,好像自己只用过syso这一个,所以最近学习了一下,初次写博客,谢绝转载. 一.Templates简介 1.1 Templates基本介绍 Myeclipse模板的查看编辑入口,Window->Preferences->Java->Editor->Tem

快速幂取模算法【模板】

快速幂取模其实是a^b%c,这就是著名的RSA公钥加密的方法,当a,b都很大的时候,直接求是不可取的,所以就用到了快速幂取模. 首先你得明白他的原理,其实是用到了二分的思想,把b按照二进制展开 b = p(n)*2^n  +  p(n-1)*2^(n-1)  +-+   p(1)*2  +  p(0).其中p(i) (0<=i<=n)为 0 或 1. 所以此时a^b =  a^ (p(n)*2^n  +  p(n-1)*2^(n-1)  +...+  p(1)*2  +  p(0))=  a^

【Luogu】P2485计算器(快速幂,exgcd和Bsgs模板)

题目链接 题目描述非常直接,要求你用快速幂解决第一问,exgcd解决第二问,bsgs解决第三问. emmmm于是现学bsgs 第二问让求最小整数解好烦啊…… 假设我们要求得方程$ax+by=c(mod p)$的最小整数解 令$d=gcd(a,b)$ 我们求得一个解$x_0,y_0$使得$ax_0+by_0=d(mod p)$ 然后$x_0*frac{c}{d}$为最小整数解. #include<cstdio> #include<cstdlib> #include<algori

快速幂(含二阶方阵类)模板

整体在一个命名空间POW中,使用时应加上POW :: **** 1 namespace POW{ 2     typedef int t; //使用时可将"int"修改为矩阵中存储的数据类型 3     const t MOD = t(1e9 + 7);//改为快速幂要求的模数 4      5     template <class T> 6         T powmod(T a, int n, T mod){ 7             T ans = a; 8  

数论——快速幂全解

1.基本原理 数据级别在1,000,000,就正常做不会超时,最简单的快速幂,根据 (a * b) % p = (a % p * b % p) % p 测试链接:http://acm.hdu.edu.cn/showproblem.php?pid=1021 #include <iostream> #include <stdio.h> using namespace std; int main(){ int n; while(scanf("%d",&n)!=

跨浏览器复制神器 ZeroClipboard 2.x快速入门详解

有些时候,我们希望让用户在网页上完成某个操作就能自动将指定的内容复制到用户计算机的剪贴板中.但是出于安全原因,大多数现代浏览器都未提供通用的剪贴板复制接口(或即便有,也默认被禁用).只有IE浏览器可以通过如下方式来进行复制. window.clipboardData.setData("Text", "这里是需要复制的文本内容") 想要实现跨浏览器的复制功能,我们就可以使用 ZeroClipboard. ZeroClipboard 及其原理介绍 ZeroClipboa

Linux系统下超大硬盘快速格式化详解

MBR,全称为Master Boot Record,即硬盘的主引导记录. 为了便于理解,一般将MBR分为广义和狭义两种:广义的MBR包含整个扇区(引导程序.分区表及分隔标识),也就是上面所说的主引导记录:而狭义的MBR仅指引导程序而言.其所支持的最大卷:2T (T; terabytes,1TB=1024GB),对分区的设限:最多4个主分区或3个主分区加一个扩展分区. 由于MBR分区表的最大可寻址的存储空间只有2Tb(232×512字节),因此,在大硬盘出现的现在,MBR分区方式逐渐被GUID分区