2 条题解

  • 0
    @ 2026-7-20 1:41:56

    P3197 [HNOI2008] 越狱——题解

    解题思路

    所有分配共有 mnm^n 种。计算补集:没有任何相邻房间信仰相同。第一个房间有 mm 种选择,后面每个房间都不能与前一个相同,各有 m1m-1 种,因此安全状态为 m(m1)n1m(m-1)^{n-1}。两者相减并取模,幂用快速幂。

    正确性说明

    全部状态被划分为“至少一对相邻相同”和“所有相邻均不同”两类,互斥且完备。后者按从左到右乘法原理计数为 m(m1)n1m(m-1)^{n-1},故相减得到目标。

    复杂度分析

    时间复杂度 O(logn)O(\log n),空间复杂度 O(1)O(1)

    易错点

    相减后要加上模数再取模,避免输出负数;当 n=1n=1 时快速幂指数为 0,答案自然为 0。

    C++17 参考代码

    #include <bits/stdc++.h>
    using namespace std;
    const long long MOD=100003;
    long long qpow(long long a,long long b){long long r=1;a%=MOD;while(b){if(b&1)r=r*a%MOD;a=a*a%MOD;b>>=1;}return r;}
    int main(){
        long long m,n;cin>>m>>n;
        long long all=qpow(m,n);
        long long safe=m%MOD*qpow(m-1,n-1)%MOD;
        cout<<(all-safe+MOD)%MOD<<'\n';return 0;
    }
    
    • 0
      @ 2026-7-20 1:41:56

      #include <bits/stdc++.h> using namespace std; const long long MOD=100003; long long qpow(long long a,long long b){long long r=1;a%=MOD;while(b){if(b&1)r=ra%MOD;a=aa%MOD;b>>=1;}return r;} int main(){ long long m,n;cin>>m>>n; long long all=qpow(m,n); long long safe=m%MOD*qpow(m-1,n-1)%MOD; cout<<(all-safe+MOD)%MOD<<'\n';return 0; }

      • 1

      信息

      ID
      4903
      时间
      2000ms
      内存
      256MiB
      难度
      10
      标签
      递交数
      1
      已通过
      1
      上传者