BZOJ 1008: [HNOI2008]越狱【组合】

本文介绍了一种快速解决染色方案计数问题的方法,通过计算不相邻同色的方案总数来间接得出至少有一组相邻格子同色的方案数量。采用快速幂优化计算过程,并给出了C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很少有的思路秒解。题意可以描述成对长度为n的格子有m种染色方案,问存在相邻两个格子同色的方案数,正难则反易,考虑问题的背面任意两个相邻的格子都不同色,第一个格子可以涂任意一种颜色m种可能,剩下的n-1个格子每个不能和前面一个格子相同固有m-1种可能,总的方案数有m^n种,所以答案就是m^n-m(m-1)^n-1 由于答案取模及幂次较高,因此可以考虑小费马定理或快速幂优化   

由于数据太2,一开始用 int读成功贡献了3个WA TAT

 

#include<iostream>

#include<cstdio>

#include <math.h>

using namespace std;

long long ksm(long long k,long long a)

{

   if(k==0)return 1;

         if(k==1)return a;

    if(k % 2 == 0)return ksm(k/2,a)*ksm(k/2,a) % 100003;

   else return (ksm(k-1,a)*a) % 100003;

}

int main()

{

   long long m=0,n=0,ans;

   scanf("%lld%lld",&m,&n);

         ans=(ksm(n,m)-(m*ksm(n-1,m-1))% 100003 +100003)%100003;

         printf("%lld",ans);

   return 0;

}

转载于:https://www.cnblogs.com/philippica/p/4006934.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值