codevs 1455 路径

题目链接

题目描述 Description

小明从A1到An+1,他知道从A1到A2,从A2到A3,......,从An到An+1都有m条路,且从A1到An+1都只有这些路。小明想知道,从A1地到An+1地共有多少种方法,由于答案可能会很大,小明只要你输出总方案数mod k。

输入描述 Input Description

输入共1行,三个正整数m,n,k

输出描述 Output Description

输出共1行,表示答案

样例输入 Sample Input

3 2 100

样例输出 Sample Output

9

数据范围及提示 Data Size & Hint

假设从A1到A2的所有路为W1,W2,W3,从A2到A3的所有路为W4,W5,W6

方案如下:

W1>>W4
W2>>W4
W3>>W4
W1>>W5
W2>>W5
W3>>W5
W1>>W6
W2>>W6
W3>>W6
共9种方案

对于100%的数据,m,k≤1,000,000,000,n≤101,000,000

题意很明显, 就是m^n%k, 但是n超级大, 所以我们用公式。 m^n%k = m^(n%phi(k)+phi(k))%k。 一下就算出来了好神奇...

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <string>
#include <queue>
#include <stack>
#include <bitset>
using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<1|1
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, n, a) for(int i = a; i<n; i++)
#define fi first
#define se second
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int mod = 1e9+7;
const int inf = 1061109567;
const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
ll p;
ll get_phi(ll n)
{
    ll res = n,i,j;
    for(i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            n=n/i;
            while(n%i==0)
                n=n/i;
            res=res/i*(i-1);
        }
        if(n<(i+1))
            break;
    }
    if(n>1)
        res = res/n*(n-1);
    return res;
}
ll pow(ll a, ll b) {
    ll ret = 1;
    while(b) {
        if(b&1)
            ret = ret*a%p;
        a = a*a%p;
        b>>=1;
    }
    return ret;
}
int main()
{
    int m;
    string n;
    cin>>m>>n>>p;
    ll phi = get_phi(p);
    ll tmp = 0;
    for(int i = 0; i<n.size(); i++) {
        tmp = tmp*10+n[i]-‘0‘;
        tmp %= phi;
    }
    tmp += phi;
    ll ans = pow(1LL*m, tmp)%p;
    cout<<ans<<endl;
    return 0;
}
时间: 2024-10-11 17:28:22

codevs 1455 路径的相关文章

求最大边/最小边的比值最小的路径 codevs 1001 舒适的路线

codevs 1001 舒适的路线 2006年 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N(1<N≤500)个景点(编号为1,2,3,…,N),这些景点被M(0<M≤5000)条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路.也许是为了保护该地的旅游资源,Z小镇有个奇怪的规定,就是对于一条给定的公路Ri,任何在该公路上行驶的车

xor和路径(codevs 2412)

题目描述 Description 给定一个无向连通图,其节点编号为1到N,其边的权值为非负整数.试求出一条从1号节点到 N 号节点的路径,使得该路径上经过的边的权值的"XOR 和"最大.该路径可以重复经过某些节点或边,当一条边在路径中出现多次时,其权值在计算"XOR 和"时也要被重复计算相应多的次数. 直接求解上述问题比较困难,于是你决定使用非完美算法.具体来说,从1号节点开始,以相等的概率,随机选择与当前节点相关联的某条边,并沿这条边走到下一个节点,重复这个过程,

[ CodeVS冲杯之路 ] P2492

不充钱,你怎么AC? 题目:http://codevs.cn/problem/2492/ 在此先orz小胖子,教我怎么路径压缩链表,那么这样就可以在任意节点跳进链表啦(手动@LCF) 对于查询操作,直接树状数组(以下简称BIT)维护,修改操作就一个个暴力开方搞,再用差值单点更新BIT 不过这样会TLE,要加一点优化对不对,正如开头所说的路径压缩链表 路径压缩链表其实就是个并查集,在普通的链表里,删去两个连续的节点后会是下面这种情况,如删去2,3 当访问 2 的时候,会跳到3,但 3 已经删除了,

【数轴染色+并查集路径压缩+加速】

http://codevs.cn/problem/1191/ [思路] 每次我们染了一个区间,下一次如果还要染这个区间或者它的子区间的话,我们就不用处理了.这样我们可以把每一个区间抽象成一个点,用并查集来维护.合并时将[L,R]区间全部合并,[L,R]区间的每个点的父节点都通过路径合并变成L-1,然后n–.这样每个点只会被合并一次,复杂度O(nα(n)) ,跑得很快. 如 3 3 fa[3]=2,操作一次 5 7, fa[7]=fa[6]=fa[5]=4,操作三次 2 8: fa[8]=fa[7

codevs——T1219 骑士游历

 http://codevs.cn/problem/1219/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 设有一个n*m的棋盘(2≤n≤50,2≤m≤50),如下图,在棋盘上有一个中国象棋马. 规定: 1)马只能走日字 2)马只能向右跳 问给定起点x1,y1和终点x2,y2,求出马从x1,y1出发到x2,y2的合法路径条数. 输入描述 Input Description 第一行2个整数n和m 第二行4个

[ CodeVS冲杯之路 ] P1169

不充钱,你怎么AC? 题目:http://codevs.cn/problem/1169/ 感觉这题目好恐怖,莫名其妙乱码一堆就AC了…… 它看上去是两个子问题,实际上可以看成从起点找两条不相交的路径使得经过的数和最大 用 f[i][j][k][l] 表示第一条走到了 (i,j) 第二条走到了 (k,l) 目标状态是 f[n][m-1][n-1][m] 一开始我也没仔细去想,就莫名其妙码了一堆交上去了,本以为会WA,结果A了?! 后面我仔细证明了一下,它是这样的 首先 l 是从 j+1 开始的,这

CodeVS 2639 约会计划

Portal:http://codevs.cn/problem/2639/ 简单题,并查集再加个map,一开始我以为要用图论,失算 FML,我的代码怎么这么长...优化太多反而慢啊...大常数大师啊... 1 #include<iostream> 2 #include<algorithm> 3 #include<set> 4 #include<cstdio> 5 #include<cstdlib> 6 #include<cmath>

【CODEVS 3287】【NOIP2013】火车运输

http://codevs.cn/problem/3287/ 题目描述 国有 座城市,编号从 到 ,城市之间有 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物. 输入格式 输入文件第一行有两个用一个空格隔开的整数 , 表示 国有 座城市和 条道路.接下来 行每行 个整数 ,每两个整数之间用一个空格隔开,表示从 号城市到 号城市有一条限重为 的道路.注意: 不等于 ,两座城市之间可能有多条道路.接下来一

Codevs 1021 (玛丽卡)

题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间. 麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路.无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市. 玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车.麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需