zoukankan      html  css  js  c++  java
  • 打表找规律C

    题目链接:https://cn.vjudge.net/contest/273377#problem/C

    给你 n,m,k.

    这个题的意思是给你n个数,在对前m项的基础上排序的情况下,问你满足递增子序列的长度至少为n-1的排列组合的个数。

    具体方法:打表找规律。

    打表代码:

    #include<bits/stdc++.h>
    #include<string>
    #include<cstring>
    #include<stdio.h>
    using namespace std;
    # define ll long long
    # define inf 0x3f3f3f3f
    const int maxn =1000;
    int a[maxn];
    int vis[maxn];
    int ww[maxn][maxn];
    int b[maxn];
    bool judge(int t,int w)
    {
        for(int i=1; i<=t; i++)
        {
            b[i]=a[i];
        }
        sort(b+1,b+w+1);
        memset(vis,0,sizeof(vis));
        int ans=0;
        int temp;
        for(int i=t; i>=1; i--)
        {
            temp=1;
            int maxx=0;
            for(int j=i; j<=t; j++)
            {
                if(b[j]>b[i])
                {
                    maxx=max(maxx,vis[j]);
                }
            }
            vis[i]=maxx+1;
        }
        for(int i=1; i<=t; i++)
        {
            if(vis[i]>=t-1)return true;
        }
        return false;
    }
    int main()
    {
        int t=10;
        while(1)
        {
            if(t==0)break;
            for(int i=1; i<=t; i++)
            {
                a[i]=i;
            }
            do
            {
                // cout<<t<<endl;
                for(int i=1; i<=t; i++)
                {
                    if(judge(t,i))
                    {
                        ww[t][i]++;
                    }
                }
    //        for(int i=0;i<t;i++)
    //        cout<<a[i]<<" ";
    //        cout<<endl;
            } while(next_permutation(a+1,a+t+1));
            t--;
        }
        for(int i=1; i<=10; i++)
        {
    
            for(int j=1; j<=i; j++)
            {
                cout<<ww[i][j]<<" ";
            }
            cout<<endl;
        }
        return 0;
        }
    /*
    
    1 
    2 2 
    5 6 6 
    10 14 24 24 
    17 26 54 120 120 
    26 42 96 264 720 720 
    37 62 150 456 1560 5040 5040 
    50 86 216 696 2640 10800 40320 40320 
    65 114 294 984 3960 18000 85680 362880 362880 
    82 146 384 1320 5520 26640 141120 766080 3628800 3628800 
    */
    
    
    

    AC代码:

    #include<bits/stdc++.h>
    #include<string>
    #include<cstring>
    #include<stdio.h>
    using namespace std;
    # define ll long long
    # define inf 0x3f3f3f3f
    const int maxn =60;
    ll dp[maxn][maxn];
    ll a[maxn];
    ll n,m,k;
    void init()
    {
        a[1]=2;
        for(int i=2; i<=50; i++)
        {
            a[i]=(a[i-1]*i)%k;
        }
        dp[1][1]=1;
        if(m>n)m=n;
        for(int i=2; i<=50; i++)
        {
            dp[i][i]=dp[i][i-1]=(dp[i-1][i-1]*i)%k;
        }
        for(int i=m+2; i<=50; i++)
        {
            dp[i][m]=(dp[i-1][m]*2-dp[i-2][m]+a[m]+k)%k;//这里需要加k,因为有可能出现负值
        }
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        int Case=0;
        while(T--)
        {
            scanf("%lld%lld%lld",&n,&m,&k);
            init();
            printf("Case #%d: ",++Case);
            printf("%lld
    ",dp[n][m]);
        }
        return 0;
    }
  • 相关阅读:
    PHP 获取图片的类型
    Shell 一次性写入多行文本
    LUA笔记
    ubuntu apt-get 出现NO_PUBKEY的解决方案
    Angular2 使用总结
    java多线程体系
    Spring ConversionFailedException: Failed to convert from type java.util.ArrayList<?> to type java.util.List<org.springframework.core.io.Resource>
    Tomcat 插件启动 Web程序
    保存图片
    Ubuntu FTP配置与安装
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10262797.html
Copyright © 2011-2022 走看看