bzoj1300: [LLH邀请赛]大数计算器
2017-07-27 21:34
204 查看
传送门
最后的十二位我们大力质因数分解之后快速幂爆出来。
前面已看只有三位于是考虑大力用log来爆过去。
我们计算出答案的log值,然后截取ans-int(ans)+2的log值。
然后我们大力pow一波然后取整爆过去你就AC辣。
最后的十二位我们大力质因数分解之后快速幂爆出来。
前面已看只有三位于是考虑大力用log来爆过去。
我们计算出答案的log值,然后截取ans-int(ans)+2的log值。
然后我们大力pow一波然后取整爆过去你就AC辣。
#include<bits/stdc++.h> #define mo 1000000000000ll #define ll long long #define N 1000005 using namespace std; int n,m,tot; int num ,pri ,fl ,mn ; ll ans=1; double dig; ll mul(ll x,ll y){ ll s=0; for (;y;y/=2,x=(x+x)%mo) if (y&1) s=(s+x)%mo; return s; } ll Pow(ll x,ll y){ ll s=1; for (;y;y/=2,x=mul(x,x)) if (y&1) s=mul(s,x); return s; } void add(int x,int f){ for (;x^1;x/=pri[mn[x]]) num[mn[x]]+=f; } void pre(int n){ for (int i=2;i<=n;i++){ if (!fl[i]) pri[++tot]=i,mn[i]=tot; for (int j=1;j<=tot&&i*pri[j]<=n;j++){ fl[i*pri[j]]=1; mn[i*pri[j]]=j; if (i%pri[j]==0) break; } } } int main(){ scanf("%d%d",&n,&m); pre(n); for (int i=m+1;i<=n;i++) add(i,1); for (int i=1;i<=n-m;i++) add(i,-1); for (int i=1;i<=tot;i++) if (num[i]){ ans=mul(ans,Pow(pri[i],num[i])); dig+=log10(pri[i])*num[i]; } if (dig<12) printf("%lld",ans); else{ long double ans2=pow(10,dig-int(dig)+2); printf("%lld...%lld",(ll)ans2,ans%1000000000); } }
相关文章推荐
- 【BZOJ1300】[LLH邀请赛]大数计算器【快速幂】【姿势】
- BZOJ1300 [LLH邀请赛]大数计算器
- bzoj1299: [LLH邀请赛]巧克力棒
- 【BZOJ】1299: [LLH邀请赛]巧克力棒
- 【BZOJ 1299】[LLH邀请赛]巧克力棒 博弈论
- [bzoj1301] [LLH邀请赛]参观路线
- 【bzoj1300】大数计算器
- bzoj:1299: [LLH邀请赛]巧克力棒
- bzoj 1299: [LLH邀请赛]巧克力棒
- [BZOJ1299][LLH邀请赛]巧克力棒(dfs+博弈)
- BZOJ.1299.[LLH邀请赛]巧克力棒(博弈论 Nim)
- 【bzoj1299】[LLH邀请赛]巧克力棒(博弈论思维题)
- bzoj 1299: [LLH邀请赛]巧克力棒(nim游戏的应用)
- bzoj1299: [LLH邀请赛]巧克力棒 简单博弈
- [BZOJ1299] [LLH邀请赛]巧克力棒(博弈Nim游戏)
- bzoj1301: [LLH邀请赛]参观路线
- bzoj1299 [LLH邀请赛]巧克力棒
- BZOJ1299: [LLH邀请赛]巧克力棒 SG函数 博弈论
- BZOJ 1299: [LLH邀请赛]巧克力棒 [组合游戏]
- BZOJ1299 [LLH邀请赛]巧克力棒