越狱(快速幂+组合数学)

题意:监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果

相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。


分析:用排除法。

不可能发生越狱的状态为m*(m-1)^(n-1)

那么总方案就是m^n-m*(m-1)^(n-1)


#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int n,maxx;
int a[26],dp[1005],f[1005];
char s[1005];
int judge(int x,int y)
{
    int l=x-y+1;
    int i;
    for(i=l;i<=x;i++)
    {
        if(a[s[i]-'a']<y)
            return 0;
    }
    return 1;
}
int main()
{
    int i,j;
    scanf("%d",&n);
    scanf("%s",s+1);

    for(i=0;i<26;i++)
        scanf("%d",&a[i]);

    memset(dp,0,sizeof(dp));
    memset(f,0,sizeof(f));

    dp[0]=1;
    maxx=0;

    for(i=1;i<=n;i++)
    {
        f[i]=1e9;
        for(j=1;j<=i;j++)
        {
            if(judge(i,j))
            {
                dp[i]=(dp[i]+dp[i-j])%(int)(1e9+7);
                f[i]=min(f[i],f[i-j]+1);
                maxx=max(maxx,j);
            }
        }
    }

    printf("%d\n%d\n%d\n",dp[n],maxx,f[n]);
    return 0;
}

### 欧拉函数相关题目 欧拉函数 φ(n) 是数论中的重要工具,常用于模运算、同余方程等问题中。以下是来自 ATCoder 和 Luogu 的 10 道适合练习欧拉函数的题目: 1. **P5091 【模板】扩展欧拉定理**(Luogu) 该题要求实现扩展欧拉定理,处理大指数幂模运算问题。 2. **CF906D Power Tower**(ATCoder 上有类似难度) 利用欧拉函数进行多次降幂,求解塔式幂模运算问题。 3. **P4866 极差**(Luogu) 结合数学归纳法与欧拉函数性质推导极差最小值。 4. **ABC164E - Two Currencies**(ATCoder) 在图论模型中使用欧拉函数优化模运算路径计算。 5. **P3768 简单的数学题**(Luogu) 综合运用莫比乌斯反演与欧拉函数推导求和公式。 6. **AGC026D - Histogram Coloring**(ATCoder) 数学建模中涉及欧拉函数的递推关系。 7. **P3934 Knuth**(Luogu) 使用欧拉函数优化区间幂次模运算。 8. **ARC090D - People on a Line**(ATCoder) 图论建模中利用欧拉函数分析模线性方程组。 9. **P4318 完全平方数**(Luogu) 二分查找结合容斥原理与欧拉函数筛法。 10. **ABC167F - Bracket Sequencing**(ATCoder) 字符串构造问题中涉及欧拉函数性质判断括号序列合法性。 --- ### 欧拉定理相关题目 欧拉定理是模幂运算的重要工具,尤其在处理极大指数时非常有效。以下为 10 道适合练习欧拉定理的题目: 1. **P5091 【模板】扩展欧拉定理**(Luogu) 标准模板题,直接应用扩展欧拉定理处理幂次模运算。 2. **CF906D Power Tower**(ATCoder) 多次应用欧拉定理对塔式幂进行降幂处理[^1]。 3. **P3768 简单的数学题**(Luogu) 推导积性函数前缀和时结合欧拉定理简化模运算。 4. **AGC026D - Histogram Coloring**(ATCoder) 数学建模中利用欧拉定理分析状态转移。 5. **P4318 完全平方数**(Luogu) 欧拉定理辅助判断平方因子的存在性。 6. **ABC164E - Two Currencies**(ATCoder) 动态规划中使用欧拉定理优化状态转移方程。 7. **P3934 Knuth**(Luogu) 区间幂次模运算中反复调用欧拉定理。 8. **CF1106F Lunar New Year and a Recursive Sequence**(ATCoder) 递归数列求解中使用欧拉定理构建指数模方程。 9. **P5498 线性递推**(Luogu) 快速矩阵幂结合欧拉定理优化指数部分。 10. **ABC167F - Bracket Sequencing**(ATCoder) 括号匹配问题中使用欧拉定理简化模幂判断。 --- ### 费马小定理相关题目 费马小定理是模逆元求解和模幂优化的常用方法,尤其在模数为质数时非常高效。以下是 10 道适合练习费马小定理的题目: 1. **P3197 [HNOI2008]越狱**(Luogu) 利用费马小定理快速计算模幂,避免溢出。 2. **P5437 【XR-2】祭坛选址**(Luogu) 组合计数中使用费马小定理求组合数模逆元。 3. **ABC164E - Two Currencies**(ATCoder) 最短路模型中使用费马小定理优化模幂计算。 4. **P3807 【模板】卢卡斯定理**(Luogu) 卢卡斯定理中依赖费马小定理求组合数模逆元。 5. **AGC001D - Arrays and XOR**(ATCoder) 数列变换中使用费马小定理优化模幂运算。 6. **P3390 【模板】矩阵快速幂**(Luogu) 矩阵快速幂中结合费马小定理处理模数为质数的情况。 7. **CF717A Festival Organization**(ATCoder) 组合计数中使用费马小定理求模逆元。 8. **P3767 膜法密码**(Luogu) 线性方程组求解中使用费马小定理求逆元。 9. **ABC167F - Bracket Sequencing**(ATCoder) 括号匹配中使用费马小定理优化模幂判断。 10. **P3934 Knuth**(Luogu) 区间幂次模运算中使用费马小定理优化指数部分。 --- ### 威尔逊定理相关题目 威尔逊定理主要用于判断质数以及阶乘模运算问题,虽然应用较少,但在特定题目中有独特作用。以下是 10 道适合练习威尔逊定理的题目: 1. **P2300 合并神犇**(Luogu) 分析阶乘模数变化,间接应用威尔逊定理。 2. **CF1225D Power Products**(ATCoder) 判断两个数的幂次乘积是否为完全平方数,涉及阶乘模运算。 3. **P3934 Knuth**(Luogu) 区间幂次模运算中结合威尔逊定理分析阶乘模数。 4. **AGC001D - Arrays and XOR**(ATCoder) 数列变换中使用威尔逊定理判断阶乘模数特性。 5. **P3768 简单的数学题**(Luogu) 数学推导中结合威尔逊定理分析模数变化。 6. **CF1106F Lunar New Year and a Recursive Sequence**(ATCoder) 递推数列中使用威尔逊定理判断模数是否存在逆元。 7. **P4318 完全平方数**(Luogu) 威尔逊定理辅助判断平方因子的存在性。 8. **ABC164E - Two Currencies**(ATCoder) 动态规划中使用威尔逊定理分析模数性质。 9. **P3934 Knuth**(Luogu) 区间幂次模运算中使用威尔逊定理分析模数特性。 10. **CF1225D Power Products**(ATCoder) 判断两个数的幂次乘积是否为完全平方数,涉及阶乘模运算。 --- ### 示例代码:使用费马小定理求模逆元 ```python MOD = 10**9 + 7 def mod_pow(a, b, mod): result = 1 a %= mod while b > 0: if b % 2 == 1: result = (result * a) % mod a = (a * a) % mod b //= 2 return result # 使用费马小定理求逆元 def mod_inverse(a, mod): return mod_pow(a, mod - 2, mod) a = 5 print(mod_inverse(a, MOD)) # 输出 5 的逆元 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值