【51nod1363】最小公倍数之和
来源:互联网 发布:云计算工程师就业 编辑:程序博客网 时间:2024/05/22 08:14
Description
给出一个n,求1-n这n个数,同n的最小公倍数的和。
例如:n = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30,6,加在一起 = 66。
由于结果很大,输出Mod 1000000007的结果。
Solution
这道题化简到一半,差点废了,后来经高人指点才明白……
我们发现当存在i与x互质时, x-i与x也是对称的,换言之,与x对称的数是对称存在的,两两相加和为x,除了1。
Code
#include<iostream>#include<cmath>#include<cstring>#include<cstdio>#include<algorithm>#define ll long longusing namespace std;const ll maxn=1e5;const ll mo=1e9+7,mo2=5e8+4;ll d[maxn],bz[maxn+5];ll n,m,i,t,j,k,l,x,y,z,ans;ll mi(ll x,ll y){ if (y==1) return x; ll t=mi(x,y/2); if (y%2==0) return t*t%mo;return t*t%mo*x%mo;}int main(){// freopen("data.in","r",stdin); scanf("%lld",&n); for (i=2;i<=maxn;i++){ if (!bz[i]) d[++d[0]]=i; for (j=1;j<=d[0];j++){ if (i*d[j]>maxn) break; bz[i*d[j]]=1; if (i%d[j]==0)break; } } for (;n;n--){ scanf("%lld",&x);ans=1;y=x; for (i=1;d[i]*d[i]<=x;i++){ if (x%d[i]) continue; t=0;k=1; while (x%d[i]==0) x/=d[i],t++; k+=d[i]*(mi(d[i],2*t)-1)%mo*mi(d[i]+1,mo-2)%mo; ans=ans*k%mo; } k=(1+(x-1)*x)%mo; ans=ans*k%mo; ans--; ans=(ans*y%mo*mo2%mo+y)%mo; printf("%lld\n",ans); }}
1 0
- 【51nod1363】最小公倍数之和
- [51nod1238]最小公倍数之和
- 51 nod 1363 最小公倍数之和
- 【51Nod 1363】最小公倍数之和
- 【51nod1238】 最小公倍数之和 V3
- 51nod1238 最小公倍数之和V3
- [51nod1190]最小公倍数之和V2
- 51nod 1363 最小公倍数之和
- 51Nod-1363-最小公倍数之和
- 最小公倍数之和 V2 51Nod
- 最小公倍数之和
- [杜教筛] 51Nod 1238 最小公倍数之和 V3
- 【51NOD 1238】最小公倍数之和 V3
- 【51nod 1190】最小公倍数之和 V2
- 51nod1238 最小公倍数之和 V3
- 51nod 1238 最小公倍数之和 V3
- 51nod 1190 最小公倍数之和V2
- 51nod 1238 最小公倍数之和 V3
- Java实现简单的数据结构(一)
- smmu学习笔记之bus_set_iommu
- Python学习笔记13
- this
- JavaScript 随机数
- 【51nod1363】最小公倍数之和
- bzoj 3566: [SHOI2014]概率充电器 概率dp+树形dp
- neutron: linuxbridge 架构解析
- 微信公众号开发之VS远程调试
- Java--IO流(InputStream,OutputStream,拷贝)
- OC中创建线程的方法是什么?如果在主线程中执行,方法是什么?如果想延时执行代码,方法是什么?
- linux驱动基础开发0——linux 设备驱动概述
- Error running app: This version of Android Studio is incompatible with the Gradle Plugin used. Try d
- 欢迎使用CSDN-markdown编辑器