zoukankan      html  css  js  c++  java
  • 2月24日考试——ZYYS

    LSGJ zyys 战队的 CYA 小垃圾,被各位神佬出的题目搞得心态爆炸。于是他模仿了蔡老师给了你两个整数 n 和 m .让你计算字母表大小为 m ,(即可用 m 个字母)长度为 n ,不存在长度至少为 2 的回文子串的字符串个数.
    输入格式
    第一行一个数 T 表示数据组数.
    接下来每行两个数 n 和 m .
    输出格式
    T 行,每行一个答案,对 10^9+7 取模
    输入输出样例
    zyys.in
    2
    56
    65
    zyys.out
    1920
    1620
    说明
    对于 10% 的数据,保证 n, m ≤ 5 .
    对于 30% 的数据,保证 n, m ≤ 20 .
    对于 50% 的数据,保证 n, m ≤ 500 .
    对于 70% 的数据,保证 n, m ≤ 100000 .
    对于 90% 的数据,保证 n, m ≤ 1∗10 ^9 .
    对于 100% 的数据,保证 n, m ≤ 1*10 ^18 , T≤ 50 .
    因为是一道很类似的题目&&ZYYS,所以没有小样例。[手动滑稽]

    Solution:

    巨说是水题,但是也有蛮多人没写出来。

    思路是组合数学,类似与HNOI越狱这道题。首先解释下题意(由于题面确实不清楚),本题求的是用m个不同的物品排列成长度为n的序列,物品可以无限量使用,但是不能排出有长度至少为2的回文子序列的序列,求方案数。

    首先,考虑拥有长度至少为2的回文子序列的序列的性质:包含类似‘aa’(某个字符和下一个字符相同)的子序列或类似‘aba’(某个字符和下下个字符相同)的子序列。

    于是由上述性质我们想到此题,要构造长度为n的满足题意的序列,则第一个位置可以放m种,而第二个位置可以放m-1种,而剩下的n-2个位置中的每个位置都只能放m-2种。

    由乘法原理我们得到结论:满足条件的方案数=m*(m-1)*(m-2)n-2

    注意:此题要开long long,且取模需要快速幂。

    代码:

     1 #include<bits/stdc++.h>
     2 #define ll long long
     3 #define il inline
     4 using namespace std;
     5 const ll mod=1000000007;
     6 il ll fast(ll x,ll k)
     7 {
     8     if(x<0)return 0;
     9     ll ans=1;x%=mod;
    10     while(k)
    11     {
    12         if(k&1)ans=ans*x%mod;
    13         x=x*x%mod;k>>=1;
    14     }
    15     return ans;
    16 }
    17 int main()
    18 {
    19     ll t,n,m;scanf("%lld",&t);
    20     while(t--){
    21         scanf("%lld%lld",&n,&m);
    22         if(n==1)printf("%lld
    ",m%mod);
    23         else printf("%lld
    ",(((m%mod)*((m-1)%mod))%mod*fast(m-2,n-2))%mod);
    24     }
    25     return 0;
    26 }
  • 相关阅读:
    java中变量命名和引用变量的一个坑
    java(2)之前往对象村
    java的print,printf,println以及输入
    HTML学习开篇
    今后的学习路径
    offline .net3.5
    java
    两个经典的Oracle触发器示例(轉)
    listview1
    Delphi连接Oracle控件ODAC的安装及使用(轉載)
  • 原文地址:https://www.cnblogs.com/five20/p/8466380.html
Copyright © 2011-2022 走看看