zoukankan      html  css  js  c++  java
  • 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 **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(T20) which represents the number of test cases.
    For each test case, there is a single line containing a string S(1length(S)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
     
    题意: 给一段只有小写字母的字符串 判断能够组合成多少种回文串
     
    题解:首先,如果不止一个字符出现的次数为奇数,则结果为0。 否则,我们把每个字符出现次数除2,也就是考虑一半的情况。 那么结果就是这个可重复集合的排列数了。
    A!/(n1!*n2!....)
    这里直接除 会出错 需要用到逆元的知识
    http://blog.csdn.net/acdreamers/article/details/8220787
    另外如何求逆元?
     
     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<map>
     5 #define ll __int64
     6 using namespace std;
     7 int n;
     8 char a[1005];
     9 #define mod 1000000007
    10 map<char,int> mp;
    11 ll quickmod(ll a,ll b)
    12 {
    13     ll sum=1;
    14     while(b)
    15     {
    16         if(b&1)
    17             sum=(sum*a)%mod;
    18         b>>=1;
    19         a=(a*a)%mod;
    20     }
    21     return sum;
    22 }
    23 
    24 int main()
    25 {
    26     scanf("%d",&n);
    27     for(int i=1;i<=n;i++)
    28     {
    29         mp.clear();
    30         int jishu=0;
    31         int sum=0;
    32         scanf("%s",a);
    33         int len=strlen(a);
    34         for(int j=0;j<len;j++)
    35             mp[a[j]]++;
    36         for(int j='a';j<='z';j++)
    37         {
    38             if(mp[j]%2==1)
    39              {
    40              jishu++;
    41              }
    42         }
    43         if(len%2==0)
    44         {
    45             if(jishu!=0)
    46             {
    47             cout<<"0"<<endl;
    48             continue;}
    49         }
    50         else
    51         {
    52             if(jishu>1)
    53             {cout<<"0"<<endl;
    54             continue;}
    55         }
    56       for(int j='a';j<='z';j++)
    57       {
    58            sum=sum+mp[j]/2;
    59       }
    60       ll ans=1;
    61       ll gg=1;
    62       for(int j='a';j<='z';j++)
    63       {
    64       for(int k=1;k<=mp[j]/2;k++)
    65          gg=gg*k%mod;
    66 
    67       }
    68       for(int j=1;j<=sum;j++)
    69       {
    70           ans=ans*j%mod;
    71       }
    72       printf("%I64d
    ",(ans*(quickmod(gg,mod-2)%mod))%mod);
    73     }
    74     return 0;
    75 }
    View Code
     
     
  • 相关阅读:
    Linux/windows查看设置环境变量指令
    转载:windows查看进程相关指令
    Ubuntu开启SSHD服务
    Ubuntu root方式登录
    洛谷P1466 集合 Subset Sums
    洛谷P1726 上白泽慧音
    洛谷P1983 车站分级
    洛谷P2577 [ZJOI2005]午餐
    洛谷P1119 灾后重建
    P1169 [ZJOI2007]棋盘制作
  • 原文地址:https://www.cnblogs.com/hsd-/p/5325677.html
Copyright © 2011-2022 走看看