Good Serial Inc.比较简单;

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1000009
#define ll long long
using namespace std;
const ll mod=;
ll f[maxn]; int main()
{
ll n,m;
f[]=;
for(ll i=;i<maxn-;i++)
{
f[i]=f[i-]*i;
if(f[i]>mod)f[i]%=mod;
}
while(scanf("%lld%lld",&n,&m)&&(n+m)>)
{
ll ans=;
if(n<m||m==||m==)
{
while(n>)
{
if(n&)ans*=m;
if(ans>mod)ans%=mod;
n>>=;
m*=m;
if(m>mod)m%=mod;
}
}
else
{
ans=f[m]+m;
if(ans>mod)ans%=mod;
}
printf("%lld\n",ans);
}
return ;
}

Bad Serial Inc.稍微复杂点,但是还是比较好理解的;

dp[i][j]表示长度为i的数组最后j位相同的数目;

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define maxn 109
#define ll long long
#define mod 987654321
using namespace std; ll dp[maxn][]; int main()
{
ll n,m;
while(scanf("%lld%lld",&n,&m)&&(n+m)>)
{
if(m==){puts("");continue;}
if(m==)
{
if(n==)puts("");
else puts("");
continue;
}
memset(dp,,sizeof dp);
dp[][]=m;
for(int i=;i<=n;i++)
{
for(int j=;j<m;j++)
{
if(dp[i][j]>mod)dp[i][j]%=mod;
dp[i+][j+]+=dp[i][j]*(m-j);//后一位与前j位都不相同
for(int k=;k<=j;k++)
dp[i+][k]+=dp[i][j];//后一位与前j位的某一位相同
if(j>||i==)
{
for(int k=;k<m-;k++)
dp[i+k][]+=dp[i][j];//连续多少位相同
}
}
}
ll ans=;
for(int i=;i<m;i++)
ans+=dp[n][i];
cout<<ans%mod<<endl;
}
return ;
}
05-08 14:57