HDU 5651 xiaoxin juju needs help 逆元

  1. 给你n个字母,求可以组成的回文串的个数
  2. 1.n为奇数,有一个字母的个数为奇数
  3. 2.n为偶数,字母个数全为偶数
  4. 然后将字母的个数num[i]/2,得出在对称轴左边的个项字母的个数
  5. 假设左边有len个字母,如果每个字母都不同则有len!中可能
  6. 然后除去所有重复的可能num[i]!即可
  7. 因为除法取模 (len!/num[i]!)%mod
  8. a^(p-1) = 1(mod p)p为素数    于是 a*a^(p-2) = 1(mod p)所以a^(p-2)替代1/a.
  9. 所以上面的公式  ->  len!*(num[i]!)^(p-2)%mod

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<cstdlib>
    #define mod 1000000007
    using namespace std;
    typedef long long LL;
    int C[550][550];
    int main()
    {
        memset(C,0,sizeof(C));
        for(int i=0;i<=505;i++)
        {
            C[i][1]=i;
            C[i][0]=1;
        }
        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;
        }
        //freopen("in.txt","r",stdin);
        int t;
        scanf("%d",&t);
        while(t--)
        {
            LL ans=1;
            int i,len,cnt=0;
            char s[1050];
            scanf("%s",s);
            len=strlen(s);
            int a[400],b[400],j=0;
            memset(a,0,sizeof(a));
            for(i=0;i<len;i++)
            {
                a[s[i]]++;
            }
            for(i=‘a‘;i<=‘z‘;i++)
            {
                if(a[i])
                {
                    b[j++]=a[i]/2;
                }
                if(a[i]%2!=0)
                cnt++;//奇数个字符的个数
            }
            if(cnt>1)
            {
                printf("0\n");
                continue;
            }
            int h=len/2;
            for(i=0;i<j;i++)
            {
                ans=(ans*C[h][b[i]])%mod;
                h-=b[i];
            }
            printf("%I64d\n",ans);
        }
        return 0;
    }
时间: 2024-10-01 03:22:42

HDU 5651 xiaoxin juju needs help 逆元的相关文章

HDU 5651 xiaoxin juju needs help(BestCoder Round #77 (div.1)1001)

传送门 xiaoxin juju needs help Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 861    Accepted Submission(s): 243 Problem Description As we all known, xiaoxin is a brilliant coder. He knew **palin

HDU 5651 xiaoxin juju needs help

组合数杨辉三角打表,这样避免了除法求逆元. #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<algorithm> using namespace std; const long long MOD=1000000007; const int maxn=1000+10; long long c[maxn][maxn]; int tot[30]; c

HDU 5651 逆元

xiaoxin juju needs help Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 809    Accepted Submission(s): 231 Problem Description As we all known, xiaoxin is a brilliant coder. He knew **palindromi

hdu5651 xiaoxin juju needs help (多重集的全排列+逆元)

xiaoxin juju needs help 题意:给你一个字符串,求打乱字符后,有多少种回文串.                      (题于文末) 知识点: n个元素,其中a1,a2,····,an互不相同,进行全排列,可得n!个不同的排列. 若其中某一元素ai重复了ni次,全排列出来必有重复元素,其中真正不同的排列数应为 ,即其重复度为ni! 同理a1重复了n1次,a2重复了n2次,····,ak重复了nk次,n1+n2+····+nk=n. 对于这样的n个元素进行全排列,可得不同排

hdu 5651 重复全排列+逆元

知识点: n个元素,其中a1,a2,····,an互不相同,进行全排列,可得n!个不同的排列. 若其中某一元素ai重复了ni次,全排列出来必有重复元素,其中真正不同的排列数应为 ,即其重复度为ni! 同理a1重复了n1次,a2重复了n2次,····,ak重复了nk次,n1+n2+····+nk=n. 对于这样的n个元素进行全排列,可得不同排列的个数实际上是  由于题目要求是对100000007取余 同余定理中对于同一个除数,两个数的乘积与它们余数的乘积同余.但这里有除法所以得用上逆元 逆元 定义

hdu NPY and girls 莫队+逆元

NPY and girls Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description NPY's girlfriend blew him out!His honey doesn't love him any more!However, he has so many girlfriend candidates.Because there are to

hdu - 3049 - Data Processing(乘法逆元)

题意:N(N<=40000)个数n1, n2, ..., nN (ni<=N),求(2 ^ n1 + 2 ^ n2 + ... + 2 ^nN) / N % 1000003. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3049 -->>RJ白书上说"由于'乘法逆'太重要了--",上一年南京区赛同学也碰到了求逆元--现在,学习了.. 什么是乘法逆?ab % m = 1 (这里的 a, b 分别都是模 m 的同余等

HDU 1576 -- A/B (总结乘法逆元的几种求法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7264    Accepted Submission(s): 5774 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%99

HDU 4869 Turn the pokers(思维+逆元)

考试的时候没有做出来... 想到了答案一定是一段连续的区间,一直在纠结BFS判断最后的可行1数. 原来直接模拟一遍就可以算出来最后的端点... 剩下的就是组合数取模了,用逆元就行了... # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include <vector> # include <queue> # includ