• HDU 5651 xiaoxin juju needs help (组合数)


    xiaoxin juju needs help
    Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d &
    %I64u
    Submit

    Status

    Description
    As we all known, xiaoxin is a brilliant coder. He knew **palindromic** strings when he was
    only a six grade student at elementry school.

    This summer he was working at Tencent as an intern. One day his leader came to ask xiaoxin
    for help. His leader gave him a string and he wanted xiaoxin to generate palindromic
    strings for him. Once xiaoxin generates a different palindromic string, his leader will
    give him a watermelon candy. The problem is how many candies xiaoxin's leader needs to
    buy?

    Input
    This problem has multi test cases. First line contains a single integer T(Tleq 20) which
    represents the number of test cases.
    For each test case, there is a single line containing a string S(1 leq length(S) leq
    1,000).

    Output
    For each test case, print an integer which is the number of watermelon candies xiaoxin's
    leader needs to buy after mod 1,000,000,007.

    Sample Input
    3
    aa
    aabb
    a

    Sample Output
    1
    2
    1

    Source
    BestCoder Round #77 (div.2)

    给你n个字母,求可以组成的回文串的个数

    只有满足以下条件才可以组成回文串。
    1.n为奇数,有一个字母的个数为奇数
    2.n为偶数,字母个数全为偶数

    然后将字母的个数num[i]/2,得出在对称轴左边的个项字母的个数
    假设左边有len个字母,如果每个字母都不同则有len!中可能
    然后除去所有重复的可能num[i]!即可
    因为除法取模 (len!/num[i]!)%mod

    #include <iostream>
    #include <cstring>
    using namespace std;
    #define mod 1000000007
    typedef long long ll;
    ll c[505][505];
    void get()
    {
        memset(c,0,sizeof(c));
        c[0][0]=1; //会涉及到
        for(int i=1;i<=500;i++)
        {
            c[i][0]=1;
            c[i][1]=i;
        }
        for(int i=2;i<=500;i++)
        for(int j=2;j<=i;j++)
        c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
    }
    int main()
    {
        get();
        int t;
        cin>>t;
        while(t--)
        {
            char str[1005];
            int a[30];
            memset(a,0,sizeof(a));
            cin>>str; //不要重复定义c
            int len=strlen(str);
            for(int i=0;i<len;i++)
            a[str[i]-'a']++;
            int flag=-1;
            for(int i=0;i<26;i++)
            {
                    if(a[i]%2)
                    flag++;
                a[i]/=2;
            }
            //cout<<flag<<endl;
            if(flag>=1)  //注意 -1 为真!!!
            {
                cout<<0<<endl;  //输出一个正整数的时候前面不能加0 否则会错
            }
            else
            {
                len/=2;
                //cout<<len<<a[0]<<a[1]<<endl;
                ll ans=1;
                for(int i=0;i<26;i++)
                {
                    ans=ans*c[len][a[i]]%mod;
                    len-=a[i];
                }
                cout<<ans<<endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    Photoshop教程,视频MP4格式转换为GIF格式
    pyqgis环境配置
    R 输出函数 格式化输出 打印函数
    linux ubuntu 更改终端的默认设置,终端大小,字体
    wps 显示所有的字符,将参考文献排序,插入目录
    在 word 中 怎么让表格旋转方向
    linux argc argv
    linux 命令行的快捷键 vim
    linux 操作系统,以及一般的操作系统 所看书籍
    win 10 快速启动 某些程序
  • 原文地址:https://www.cnblogs.com/Ritchie/p/5343418.html
Copyright © 2020-2023  润新知