逆元用于用于对除法运算取模的运算

 表示 逆元

求解逆元

方法一:拓展欧几里得求逆元(求单个数的逆元)

已知 

同时取模

可见的逆元

所以中的

int ex_gcd(int a, int b, int &x, int &y){if (b == 0){x = 1;y = 0;return a;}int tmp = ex_gcd(b, a % b, y, x);y -= a/b*x;return tmp;
}int inv(int a, int mod){ //a对于mod的逆元int x, y;ex_gcd(a, mod, x, y);return x;
}

方法二:费马小定理(求单个数的逆元)

可见的逆元

int fp(int x, int p){if (p == 1) return 1 % mod;int tmp = fp(x, p / 2);if (p & 1) return tmp * tmp % * x % mod;return tmp * tmp % mod;
}int inv(int a, int mod){return fp(a, mod - 2);
}

方法三:线性求逆元(求一段区间内的所有逆元)

假设
 
再替换 t,k 

inv[1] = 1;
for(int i = 2; i <= n ; i++)  inv[i] = ( m - m / i ) * inv[ m % i ] % m;

在求解组合数的时候,分子通常会出现某个数的阶乘,下面讲解阶乘逆元

方法一:正推(同时用到

记为

inv[1]=inv_fac[i]=1;
for(int i=2;i<N;i++){  inv[i]=(mod-mod/i)*inv[mod%i]%mod;  //求inv[i]inv_fac[i]=inv[i]*inv_fac[i-1]%mod;
}

方法二:逆推(只用到

先用费马小定理或者拓展欧几里得先求出

    inv_fac[N] = fp(fac[N], mod - 2ll);for (int i = 999; i >= 1; i--){inv_fac[i] = inv_fac[i + 1] * (i + 1) % mod;}

例题HDU5651

xiaoxin juju needs help

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2981    Accepted Submission(s): 993

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(T≤20) which represents the number of test cases.
For each test case, there is a single line containing a string S(1≤length(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

BestCoder Round #77 (div.2)

Recommend

wange2014

code

/**逆元在乘法中的运用*/
#include <bits/stdc++.h>
#define FOR(I,S,T) for(int I=(S);I<=(T);I++)
#define pb push_back
#define mp make_pair
#define eb emplace_backusing namespace std;
typedef long long ll;
const int maxn = 1e4+2;
const int inf = 0x3f3f3f3f;
const int INF = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1e9 + 7;string s;
ll inv_fac[maxn];
ll fac[maxn];
ll fp(ll x, ll p){if (p == 0) return 1 % mod;ll t = fp(x, p / 2) % mod;if (p & 1) return t * t % mod * x %mod;return t * t % mod;
}
int cnt[maxn];
vector <int> tmp;
int main()
{int T;cin >> T;fac[0] = 1;FOR(i,1,1000) fac[i] = fac[i - 1] * i % mod;inv_fac[1000] = fp(fac[1000], mod - 2ll);for (int i = 999; i >= 1; i--){inv_fac[i] = inv_fac[i + 1] * (i + 1) % mod;}inv_fac[0] = inv_fac[1];int f = 0;while (T--){tmp.clear();cin >> s;sort(s.begin(), s.end());cnt[0]= 1;f = 0;for (int i = 1; i < s.size(); i++){if (s[i] == s[i-1] ) cnt[i]= cnt[i - 1]+1;else {cnt[i] = 1;if (cnt[i -1] & 1) f++;if (cnt[i-1] & 1) tmp.eb(cnt[i-1]-1);else tmp.eb(cnt[i-1]);}}if (s.size() > 1){if (cnt[s.size() - 1] & 1) f++,tmp.eb(cnt[s.size() - 1] -1);else tmp.eb(cnt[s.size() - 1]);}if (f > 1){puts("0");continue;}ll ans = fac[s.size() / 2];for (int i = 0; i < tmp.size(); i++){ans = ans * inv_fac[tmp[i] / 2] % mod;}cout << ans << endl;}return 0;
}

逆元 阶乘逆元 数论 HDU 5651 xiaoxin juju needs help相关推荐

  1. hdu5651 xiaoxin juju needs help(逆元)

    xiaoxin juju needs help Accepts: 150 Submissions: 966 Time Limit: 2000/1000 MS (Java/Others) Memory ...

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

    xiaoxin juju needs help 题意:给你一个字符串,求打乱字符后,有多少种回文串.                      (题于文末) 知识点: n个元素,其中a1,a2,··· ...

  3. 预处理阶乘和阶乘逆元_计算数字的阶乘| 8086微处理器

    预处理阶乘和阶乘逆元 Problem statement: 问题陈述: Write an assembly language program for calculating the factorial ...

  4. bestcoder #77 xiaoxin juju needs help

    xiaoxin juju needs help  Accepts: 134  Submissions: 309  Time Limit: 2000/1000 MS (Java/Others)  Mem ...

  5. 数学--数论--Hdu 5793 A Boring Question (打表+逆元)

    There are an equation. ∑0≤k1,k2,⋯km≤n∏1⩽j<m(kj+1kj)%1000000007=? We define that (kj+1kj)=kj+1!kj! ...

  6. 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)

    先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...

  7. 线性求逆元模板_ACM 数论基本模板

    ACM 数论基本模板 1.欧几里得 求最大公约数,最小公倍数 (1)递归的写法:int gcd(int a,int b) {return b?gcd(b,a%b):a;} (2)辗转相除法: int ...

  8. 还是逆元之O(n)阶乘逆元。。。

    除草 做一个题发现了一个逆元的知识盲点,就是阶乘的逆元 然后发现了可以这样 fac[0]=fac[1]=1; for(int i=2;i<=MAXN;i++)fac[i]=fac[i-1]*i% ...

  9. 阶乘逆元与组合数模板

    单纯存模板. 以D - Iroha and a Grid的AC代码为例 #include<bits/stdc++.h> using namespace std; #define ll lo ...

  10. (回文串全排列个数) xiaoxin juju needs help

    题目 As we all known, xiaoxin is a brilliant coder. He knew palindromic strings when he was only a six ...

最新文章

  1. 关于一个js连续赋值问题之我见(词略穷,见谅)
  2. 带你学python基础:变量和基本数据类型
  3. Taro+react开发(22)--模态框组件
  4. python的百分号和斜杠 除_关于python:如何替换除字母,数字,正斜杠和反斜杠之外的所有字符...
  5. LeetCode 263. Ugly Number
  6. 指针c语言求电阻的并联值,计算电阻使之符合要求值,,“简单”的难题!!!...
  7. AT:AT命令控制上网 PDP
  8. matlab不用循环,三维矩阵按横切页(垂直于纸面且)向右展开为2维,即(i,j,:)展开。将二维矩阵每行顺序不变依次向左复制,如:(a,b,c)复制为(a,a,a,b,b,b,c,c,c)
  9. ORM的个人简单理解以及持久化和持久层的简单理解、Hibernate的简单理解,mybatis 的好处通俗易懂
  10. malloc.h头文件和malloc函数详解
  11. pr新建字幕样式(模板)
  12. 【homework】类与对象的基础应用(Student类)
  13. linux如何装输入法,如何在linux下安装智能拼音输入法
  14. Java调用SharePoint WebService获取文件和文件夹
  15. 线程main java中的异常怎么解决_线程“ main”中的异常java.lang.NoClassDefFoundError:...
  16. OSChina 周日乱弹 ——请世界不要对好人太薄情
  17. CentOS的下载与安装
  18. php页面导出csv,使用PHP生成并导出CSV文件
  19. java通过POI快速读取excel大量数据的方式
  20. VS Code中常用插件

热门文章

  1. 计算机毕业设计springbootiMeli在线彩妆店铺
  2. ssh登录极路由后台_自己动手DIY:路由器刷机改造
  3. 系统开发方法和开发模型
  4. oracle认证考试指南全册,OCP认证考试指南全册Oracle Database10g
  5. UTM(Urchin Tracking Module)简介
  6. ubuntu16.04升级18.04时问题, (appstreamcli:5132): GLib-CRITICAL **: g_strchomp: assertion 'string != NULL'
  7. python 读词向量文件
  8. [Android6.0][MTK6737] 修改默认允许位置来源第三方应用安装
  9. 树莓派控制PCF8591 AD/DA模块
  10. WEB安全漏洞扫描与处理(下)——安全报告分析和漏洞处理