9.16 第四题 数论 欧拉筛+唯一分解定理
2017-09-20 19:53
411 查看
题目大意:
输入n;
从1到n找一些数乘起来,使得答案是一个完全平方数,并尽量使这个数大,答案模100000007;
样例:
输入
7
输出
144
1.将所有合数分解为素数;
2.统计所有分解后 每个素数的个数;
3.个数为奇数 ,个数减一跑快速幂,偶数直接跑;
统计素数个数
n=8;1~8中
2的个数:
2:1个
4:2个
6:1个
8:3个
2的个数=8/2+8/4+8/8=7;
及n/2^1+n/2^2+……+n/2^k=num;
机智……
输入n;
从1到n找一些数乘起来,使得答案是一个完全平方数,并尽量使这个数大,答案模100000007;
样例:
输入
7
输出
144
Q
思路:1.将所有合数分解为素数;
2.统计所有分解后 每个素数的个数;
3.个数为奇数 ,个数减一跑快速幂,偶数直接跑;
统计素数个数
n=8;1~8中
2的个数:
2:1个
4:2个
6:1个
8:3个
2的个数=8/2+8/4+8/8=7;
及n/2^1+n/2^2+……+n/2^k=num;
机智……
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const ll MAXN=6000001,mod=100000007; ll is_prime[MAXN],cnt,n,num[MAXN]; bool not_prime[MAXN]; void euler() { not_prime[1]=true; for(ll i=2;i<=n;i++) { if(!not_prime[i]) is_prime[++cnt]=i; for(ll j=1;j<=cnt && is_prime[j]*i<=0;j++) { not_prime[is_prime[j]*i]=true; if(i % is_prime[j]==0) break; } } return; } ll ksm(ll a,ll b) { ll ans=1; while(b) { if(b & 1) ans=(ans*a)%mod; a=(a*a)%mod; b>>=1; } return ans%mod; } void solve() { cin>>n; euler(); for(ll i=1;i<=cnt;i++) { ll s=n; while(s) { num[i]+=s/is_prime[i]; s/=is_prime[i]; } } ll an=1; for(ll i=1;i<=cnt;i++) { if(num[i]%2) an=(an*ksm(is_prime[i],num[i]-1)%mod)%mod; else an=(an*ksm(is_prime[i],num[i])%mod)%mod; } cout<<an; c52a } int main() { solve(); return 0; }
相关文章推荐
- Sumdiv--数论+快速幂取模+唯一分解定理+欧拉筛
- 欧几里得算法和唯一分解定理(数论)
- 唯一分解定理(数论)
- 欧几里得算法和唯一分解定理(数论)
- HDU-1215 七夕节 数论 唯一分解定理 求约数之和
- 2015多校联合第十场hdu5407CRB and Candies数论 唯一分解定理
- Uva10375 Choose and divide(数论、唯一分解定理、快速幂)
- Aladdin and the Flying Carpet LightOJ - 1341 数论/唯一分解定理
- Uva10791 Minimum Sum LCM(数论、唯一分解定理)
- 【数论】Choose and Divide, UVa10375 【组合数学】【唯一分解定理】【精度】
- 数论--唯一分解定理及代码实现
- Choose and divide UVA - 10375 (数论+唯一分解定理)
- uva 10375 唯一分解定理 筛法求素数【数论】
- 数论-唯一分解定理
- [数论]唯一分解定理
- 关于数论中唯一分解定理的问题
- 数论:整数的唯一分解定理及其应用小结
- HDU 2608 - 0 or 1 (数论 + 唯一分解定理)
- poj 1845 数论(唯一分解定理+分治法求等比数列前n项的和mod m的值)
- (数论)最大公约数、最小公倍数、唯一分解定理