hdu 3481 3482

Good Serial Inc.比较简单;

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

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][11];

int main()
{
    ll n,m;
    while(scanf("%lld%lld",&n,&m)&&(n+m)>0)
    {
        if(m==1){puts("0");continue;}
        if(m==2)
        {
            if(n==1)puts("2");
            else puts("0");
            continue;
        }
        memset(dp,0,sizeof dp);
        dp[1][1]=m;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<m;j++)
            {
                if(dp[i][j]>mod)dp[i][j]%=mod;
                dp[i+1][j+1]+=dp[i][j]*(m-j);//后一位与前j位都不相同
                for(int k=2;k<=j;k++)
                    dp[i+1][k]+=dp[i][j];//后一位与前j位的某一位相同
                if(j>1||i==1)
                {
                    for(int k=1;k<m-1;k++)
                        dp[i+k][1]+=dp[i][j];//连续多少位相同
                }
            }
        }
        ll ans=0;
        for(int i=1;i<m;i++)
            ans+=dp[n][i];
        cout<<ans%mod<<endl;
    }
    return 0;
}
View Code

 

posted @ 2014-03-11 17:33  Yours1103  阅读(168)  评论(0编辑  收藏  举报