牛客小白月赛14 -A (找规律+除数取模)

N个城市K天旅行方案数算法解析
本文解析了一个关于N个城市中K天旅行的算法问题,通过动态规划的方法求解从任意城市出发并最终回到起点的方案数,避免连续两天停留在同一城市。文章详细阐述了解题思路,给出了具体的数学推导过程,并提供了AC代码实现。

题目链接:https://ac.nowcoder.com/acm/contest/879/A

题意:有n个城市,编号1~n,k天,第一天位于城市1,要求最后一天在城市1,且相邻两天不在同一个城市,求方案数。

思路:设k天后在城市1的方案数为f(k),前k-1天每天有n-1种选择,最后一天必须去城市1,即有(n-1)^(k-1)种可能,但是这包括了倒数第二天在城市1的情况。但我们会发现倒数第二天在城市1的方案数即f(k-1),即f(k)=(n-1)^(k-1)-f(k-1)。

  不访列举前几项:

    f(k=1)=0

    f(k=2)=n-1

    f(k=3)=(n-1)^2-f(k=2)=(n-1)^2-(n-1)

    f(k=4)=(n-1)^3-f(k-3)=(n-1)^3-(n-1)^2+(n-1)

  可以发现每一项均是等比数列的求和等式。于是有f(k)=[(-1)k*(n-1)+(n-1)k]/n。

  要将这个式子对MOD=998244353取模,需要用到公式a/b%m=a%(b*m)/b。

AC代码:

#include<cstdio>
using namespace std;
typedef long long LL;
const LL MOD =998244353;

LL n,k,M;

LL qmul(LL a,LL b){
    LL ret=0;
    while(b){
        if(b&1) ret=(ret+a)%M;
        a=(a+a)%M;
        b>>=1;
    }
    return ret;
}

LL qpow(LL a,LL b){
    LL ret=1;
    while(b){
        if(b&1) ret=qmul(ret,a);
        a=qmul(a,a);
        b>>=1;
    }
    return ret;
}

int main(){
    scanf("%lld%lld",&n,&k);
    M=n*MOD;
    if(k&1)
        printf("%lld\n",(M-n+1+qpow(n-1,k))%M/n);
    else
        printf("%lld\n",(n-1+qpow(n-1,k))%M/n);
    return 0;
}

 

转载于:https://www.cnblogs.com/FrankChen831X/p/10852111.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值