dts的一个脑洞第2期

dts的一个脑洞第2期

Background

dts脑洞第2期

Description

将一个n棱锥的每个顶点染上一种颜色,有m种颜色可供使用,使得同一条棱的两端点异色,问有多少种不同的染色方式。
请回答方案数对k取模的结果,k将在输入中给出,数据保证k是一个质数。

Format

Input

输入包含多组数据,请处理到文件结束
每组数据1行,包含n,m,k三个数

Output

对于每组数据,输出一行一个数,方案数对k取模的结果

Sample 1

Input

3 4 10007

Output

9

Limitation

1s, 4194304KiB for each test case.

Hint

每组输入不超过10^5组数据
对于100%的数据,每组n,m,k满足,3≤n≤2^60,4≤m≤2^60,k≤2^30

C++ Code

#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
#include <vector>
#include <deque>
#include <set>
#include <limits>
#include <string>
#include <sstream>
using namespace std;

namespace dts
{
    typedef long long ll;
    
    ll n,m,key;
    
    ll qp(ll x,ll y,ll key)
    {
        ll ans=1;
        for (ll i=x,j=y;j>0;i=(i*i)%key,j/=2)
            if (j&1)
                ans=(ans*i)%key;
        return ans;
    }
    
    void main()
    {
        while (~scanf("%lld%lld%lld",&n,&m,&key))
        {
            m%=key;
            if (m-2<0)
                m+=key;
            ll ans=(m-1)*((qp(m-2,n-1,key)+((n&1)?-1:1))%key)%key;
            printf("%lld\n",ans);
        }
    }
};

int main()
{
    dts::main();
}

Source

Vijos Original

信息

难度
9
分类
组合数学 点击显示
标签
递交数
1
已通过
1
通过率
100%
上传者

相关

在下列比赛中:

sky1231的域的全部舊題目