hdu 4196(数论)
题意:问小于n的数的乘积能拼成的最大平方数是多少?
思路:给n!做质数分解在除去指数为奇数的那些质数,由于题目中需要模运算所以不能直接除,必须乘上摸逆。
代码如下:
1 /************************************************** 2 * Author : xiaohao Z 3 * Blog : http://www.cnblogs.com/shu-xiaohao/ 4 * Last modified : 2014-06-28 15:26 5 * Filename : hdu_4196.cpp 6 * Description : 7 * ************************************************/ 8 9 #include <iostream> 10 #include <cstdio> 11 #include <cstring> 12 #include <cstdlib> 13 #include <cmath> 14 #include <algorithm> 15 #include <queue> 16 #include <stack> 17 #include <vector> 18 #include <set> 19 #include <map> 20 #define MP(a, b) make_pair(a, b) 21 #define PB(a) push_back(a) 22 23 using namespace std; 24 typedef long long ll; 25 typedef pair<int, int> pii; 26 typedef pair<unsigned int,unsigned int> puu; 27 typedef pair<int, double> pid; 28 typedef pair<ll, int> pli; 29 typedef pair<int, ll> pil; 30 31 const int INF = 0x3f3f3f3f; 32 const double eps = 1E-6; 33 const int MOD = 1e9+7; 34 const int MAXN = 10000000+1; 35 int prime[MAXN], n; 36 int f[MAXN]; 37 38 void getPrime() 39 { 40 memset(prime,0,sizeof(prime)); 41 for(int i = 2;i <= MAXN;i++) 42 { 43 if(!prime[i])prime[++prime[0]] = i; 44 for(int j = 1;j <= prime[0] && prime[j] <= MAXN/i;j++) 45 { 46 prime[prime[j]*i] = 1; 47 if(i % prime[j] == 0)break; 48 } 49 } 50 } 51 52 ll inv(ll a,ll m) 53 { 54 if(a == 1)return 1; 55 return inv(m%a,m)*(m-m/a)%m; 56 } 57 58 //求x!中p(素数)因子的个数 59 ll ff(ll x, ll p){ 60 ll tp = p, ret = 0; 61 while(tp <= x){ 62 ret += (x/tp); 63 tp = tp*p; 64 } 65 return ret; 66 } 67 68 int main() 69 { 70 freopen("in.txt", "r", stdin); 71 72 f[0] = 1; 73 for(int i=1; i<=MAXN; i++) 74 f[i] = (ll)f[i-1] * i % MOD; 75 getPrime(); 76 while(scanf("%d", &n)!=EOF && n){ 77 ll ans = 1; 78 for(int i=1; i <= prime[0] && prime[i]<=n; i++){ 79 ll tp = ff(n, prime[i]); 80 if(tp & 1) ans = (ll)ans * prime[i] % MOD; 81 } 82 ans = (f[n] * inv(ans, MOD))%MOD; 83 printf("%I64d\n", ans); 84 } 85 return 0; 86 }
View Code
转载于:https://www.cnblogs.com/shu-xiaohao/p/3813971.html
hdu 4196(数论)相关推荐
- hdu 3641 数论 二分求符合条件的最小值数学杂题
http://acm.hdu.edu.cn/showproblem.php?pid=3641 学到: 1.二分求符合条件的最小值 /*================================= ...
- HDU 4651 数论 partition 求自然数的拆分数
别人的解题报告: http://blog.csdn.net/zstu_zlj/article/details/9796087 我的代码: 1 #include <cstdio> 2 #de ...
- HDU 6069 数论 区间素数筛 + 赛后反思
题目链接 设 x = p 1 a 1 p 2 a 2 . . . . p n a n x = p_1^{a_1}p_2^{a_2}....p_n^{a_n} x=p1a1p2a2....pna ...
- 7. 数论四大定理(威尔逊定理、欧拉定理、费马小定理、孙子定理)
一.准备工作 点击查看数论基础知识 二.威尔逊定理 威尔逊定理给出了判定一个自然数是否为素数的充分必要条件.但是由于阶乘是呈爆炸增长的,其结论对于实际操作意义不大. 1. 定理及其变形 当且仅当p为素 ...
- NOI数学:莫比乌斯变换
P5491 [模板]二次剩余 [模板]二次剩余 - 洛谷 P1082 [NOIP2012 提高组] 同余方程 [NOIP2012 提高组] 同余方程 - 洛谷 [模板题]Luogu-P4717 快速莫 ...
- 三个重要的同余式——威尔逊定理、费马小定理、欧拉定理 + 求幂大法的证明
一.威尔逊定理 若p为质数,则 p|(p-1)!+1 亦:(p-1)! ≡ p-1 ≡ -1(mod p) 例题: HDU 2973 YAPTCHA (威尔逊定理及其逆定理) 解题报告见http:// ...
- 数学--数论--HDU - 6395 Let us define a sequence as below 分段矩阵快速幂
Your job is simple, for each task, you should output Fn module 109+7. Input The first line has only ...
- 数学--数论--HDU 2582 F(N) 暴力打表找规律
This time I need you to calculate the f(n) . (3<=n<=1000000) f(n)= Gcd(3)+Gcd(4)+-+Gcd(i)+-+Gc ...
- hdu 3123(GCC)数论
http://acm.hdu.edu.cn/showproblem.php?pid=3123 题目给出的n很大,很明显如果n很大时,是不用处理到n的,所以其中必有蹊跷! 当n大于m时 ,n的阶乘中必定 ...
最新文章
- 与跨国巨头合作,做羊还是做狼? --- 我看SAP取消HAND合作伙伴资格
- maven根据profile动态选择配置文件
- Python的生成器(generator)
- html鼠标点击有手势出来,用原生js+css3撸的一个下拉手势事件插件
- 树莓派使用STEP4:安装vim
- 小县城里的体制内剩女:一个日益庞大却被悬置的群体?
- sqlserver html文档,[SQLServer]从SQL中的一个表中导出HTML文件表格
- Python版插入排序算法
- c语言给一个函数添加功能,【C语言】请编写实现以下功能函数:实现对一个8bit数据(unsigned char)的指定位(例如第8位)的置0或置1操作,并保持其他位不变...
- 2022-03-29 软件外包流程
- 软件评測师真题考试分析-5
- 尚硅谷Java8 新特性学习笔记
- 获取时间戳及转化为yyyyMMdd格式的时间
- 服务器PCI插槽上的固态硬盘,固态硬盘常见接口图解
- 编译原理中单线箭头->和双线箭头=>有什么区别
- R语言编程技术(2)
- matlab fisher检验,模式识别中Fisher分类器的Matlab实现及测试
- gt,gte,lt,lte含义
- java随机生成车牌号函数
- 画出spi输出bdh数据总线时序图_单片机张毅刚课后习题答案.docx