ATcoder E - Flatten
Posted accepting
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ATcoder E - Flatten相关的知识,希望对你有一定的参考价值。
题解:其实就是求n个数的lcm,由于数据特别大,求lcm时只能用质因子分解的方法来求。
质因子分解求lcm。对n个数每个数都进行质因子分解,然后用一个数组记录某个质因子出现的最大次数。然后累乘pow(x,cnt),即质因子x出现了cnt次。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll N=1E6+7; const ll mod=1e9+7; ll arr[N]; ll mp[N]; ll ksm(ll a,ll b){ ll res=1; while(b){ if(b&1) res=res*a%mod; a=a*a%mod; b>>=1; } return res%mod; } int main() { ios::sync_with_stdio(false ); ll n; cin>>n; ll mx=0; for(ll i=1;i<=n;i++){ cin>>arr[i]; mx=max(mx,arr[i]); } ll pos=0; for(ll i=1;i<=n;i++){ ll x=arr[i]; ll y=sqrt(x); for(ll j=2;j<=y;j++){ ll cnt=0; while(x%j==0){ x/=j; cnt++; } mp[j]=max(mp[j],cnt); } if(x!=1) mp[x]=max(mp[x],(ll)1); } ll sum=1; for(ll i=1;i<=mx;i++) sum=(sum%mod*ksm(i,mp[i])%mod)%mod; ll ans=0; for(ll i=1;i<=n;i++){ ans+=sum*ksm(arr[i],mod-2)%mod; } cout<<ans%mod<<endl; return 0; }
以上是关于ATcoder E - Flatten的主要内容,如果未能解决你的问题,请参考以下文章
AtCoder Beginner Contest 173 E - Multiplication 4 (思维)
AtCoder Beginner Contest 159 E - Dividing Chocolate枚举
AtCoder Grand Contest 026 (AGC026) E - Synchronized Subsequence 贪心 动态规划