逆元 阶乘逆元 数论 HDU 5651 xiaoxin juju needs help
逆元用于用于对除法运算取模的运算
表示 的逆元
求解逆元
方法一:拓展欧几里得求逆元(求单个数的逆元)
已知
同时取模得
可见是的逆元
所以中的
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 helpTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 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. 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相关推荐
- hdu5651 xiaoxin juju needs help(逆元)
xiaoxin juju needs help Accepts: 150 Submissions: 966 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- hdu5651 xiaoxin juju needs help (多重集的全排列+逆元)
xiaoxin juju needs help 题意:给你一个字符串,求打乱字符后,有多少种回文串. (题于文末) 知识点: n个元素,其中a1,a2,··· ...
- 预处理阶乘和阶乘逆元_计算数字的阶乘| 8086微处理器
预处理阶乘和阶乘逆元 Problem statement: 问题陈述: Write an assembly language program for calculating the factorial ...
- bestcoder #77 xiaoxin juju needs help
xiaoxin juju needs help Accepts: 134 Submissions: 309 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- 数学--数论--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! ...
- 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)
先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...
- 线性求逆元模板_ACM 数论基本模板
ACM 数论基本模板 1.欧几里得 求最大公约数,最小公倍数 (1)递归的写法:int gcd(int a,int b) {return b?gcd(b,a%b):a;} (2)辗转相除法: int ...
- 还是逆元之O(n)阶乘逆元。。。
除草 做一个题发现了一个逆元的知识盲点,就是阶乘的逆元 然后发现了可以这样 fac[0]=fac[1]=1; for(int i=2;i<=MAXN;i++)fac[i]=fac[i-1]*i% ...
- 阶乘逆元与组合数模板
单纯存模板. 以D - Iroha and a Grid的AC代码为例 #include<bits/stdc++.h> using namespace std; #define ll lo ...
- (回文串全排列个数) xiaoxin juju needs help
题目 As we all known, xiaoxin is a brilliant coder. He knew palindromic strings when he was only a six ...
最新文章
- 关于一个js连续赋值问题之我见(词略穷,见谅)
- 带你学python基础:变量和基本数据类型
- Taro+react开发(22)--模态框组件
- python的百分号和斜杠 除_关于python:如何替换除字母,数字,正斜杠和反斜杠之外的所有字符...
- LeetCode 263. Ugly Number
- 指针c语言求电阻的并联值,计算电阻使之符合要求值,,“简单”的难题!!!...
- AT:AT命令控制上网 PDP
- matlab不用循环,三维矩阵按横切页(垂直于纸面且)向右展开为2维,即(i,j,:)展开。将二维矩阵每行顺序不变依次向左复制,如:(a,b,c)复制为(a,a,a,b,b,b,c,c,c)
- ORM的个人简单理解以及持久化和持久层的简单理解、Hibernate的简单理解,mybatis 的好处通俗易懂
- malloc.h头文件和malloc函数详解
- pr新建字幕样式(模板)
- 【homework】类与对象的基础应用(Student类)
- linux如何装输入法,如何在linux下安装智能拼音输入法
- Java调用SharePoint WebService获取文件和文件夹
- 线程main java中的异常怎么解决_线程“ main”中的异常java.lang.NoClassDefFoundError:...
- OSChina 周日乱弹 ——请世界不要对好人太薄情
- CentOS的下载与安装
- php页面导出csv,使用PHP生成并导出CSV文件
- java通过POI快速读取excel大量数据的方式
- VS Code中常用插件
热门文章
- 计算机毕业设计springbootiMeli在线彩妆店铺
- ssh登录极路由后台_自己动手DIY:路由器刷机改造
- 系统开发方法和开发模型
- oracle认证考试指南全册,OCP认证考试指南全册Oracle Database10g
- UTM(Urchin Tracking Module)简介
- ubuntu16.04升级18.04时问题, (appstreamcli:5132): GLib-CRITICAL **: g_strchomp: assertion 'string != NULL'
- python 读词向量文件
- [Android6.0][MTK6737] 修改默认允许位置来源第三方应用安装
- 树莓派控制PCF8591 AD/DA模块
- WEB安全漏洞扫描与处理(下)——安全报告分析和漏洞处理