2 条题解

  • 5
    @ 2025-12-10 9:05:40

    科普:环形染色公式(中间不染色)的推导

    我们先把他当链做:这样有 m(m1)n1m (m-1)^{n-1} 种做法。

    在变成环,分类讨论:

    1. 11nn 相同这样就有 fn1f_{n-1} 种方案

    2. 反之,为 fnf_n 种做法

    所以 fn+fn1=m(m1)n1f_n+f_{n-1}=m(m-1)^{n-1}

    还可以化:

    $$f_n+f_{n-1}=m(m-1)^{n-1}=(m-1+1)(m-1)^{n-1}=(m-1)^n+(m-1)^{n-1} $$

    移项,得

    fn(m1)n=(fn1(m1)n1)f_n-(m-1)^n=-(f_{n-1}-(m-1)^{n-1})

    我们令 bn=fn(m1)nb_n={f_n-(m-1)^n},你会发现

    bnbn1=1\large \frac{b_n}{b_{n-1}}=-1,所以 bb 是个等比数列。

    n=2n=2 时,显然,f2=m(m1)f_2=m(m-1),则

    b2=f2(m1)2=m(m1)(m1)2=m1b_2=f_2-(m-1)^2=m(m-1)-(m-1)^2=m-1

    所以 bn=b2×(1)n2=(1)n×(m1)b_n=b_2 \times (-1)^{n-2} = (-1)^n\times (m-1)

    又因为 fn=bn+(m1)nf_n=b_n+(m-1)^n

    所以 fn=(m1)n+(1)n×(m1)f_n=(m-1)^n+(-1)^n\times(m-1)

    • 2
      @ 2026-9-11 9:28:11

      如果你不想推公式。

      钦定中间块颜色,转化成环染色。直接讨论 11n1n-1 是否相同,如果相同,把 11n1n-1 看成一个块,答案是 (m2)f(n2)(m-2)f(n-2),如果不同,直接忽略 nn,令 11n1n-1 相接,答案是 (m3)f(n1)(m-3)f(n-1)。于是有 f(n)=(m2)f(n2)+(m3)f(n1)f(n)=(m-2)f(n-2)+(m-3)f(n-1),矩阵加速即可。

      #include<iostream>
      #include<algorithm>
      #include<vector>
      #define int long long
      using namespace std;
      const int MOD=1e9+7;
      int n,m;
      struct matrix{
      	int n,m;
      	int num[2][2];
      	matrix operator*(const matrix& mtrx)const{
      		matrix res={n,mtrx.m,{{0,0},{0,0}}};
      		if(m!=mtrx.n) return res;
      		for(int i=0;i<n;i++)
      			for(int j=0;j<mtrx.m;j++)
      				for(int k=0;k<m;k++)
      					(res.num[i][j]+=num[i][k]*mtrx.num[k][j])%=MOD;
      		return res;
      	}
      }I={2,2,{{1,0},{0,1}}},A,T,Ans;
      matrix qpow(matrix x,int b){
      	matrix res=I;
      	for(;b;b>>=1,x=x*x) if(b&1) res=res*x;
      	return res;
      }
      signed main(){
      	ios::sync_with_stdio(0);
      	cin.tie(0);
      	while(cin>>n>>m){
      		if(n==1){
      			cout<<m*(m-1)%MOD<<'\n';
      			continue;
      		}
      		A={2,1,{{(m-1)*(m-2)%MOD},{0}}};
      		T={2,2,{{m-3,m-2},{1,0}}};
      		Ans=qpow(T,n-2)*A;
      		cout<<Ans.num[0][0]*m%MOD<<'\n';
      	}
      	return 0;
      } 
      
      • 1

      信息

      ID
      250
      时间
      1000ms
      内存
      256MiB
      难度
      7
      标签
      (无)
      递交数
      39
      已通过
      10
      上传者