1363 最小公倍数之和

题目来源: SPOJ
基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160
给出一个n,求1-n这n个数,同n的最小公倍数的和。
例如:n = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30,6,加在一起 = 66。

由于结果很大,输出Mod 1000000007的结果。
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 50000)
第2 - T + 1行:T个数A[i](A[i] <= 10^9)
Output
共T行,输出对应的最小公倍数之和
Input示例
3
5
6
9
Output示例
55
66
279
思路:这题数据很大,还需要一些剪枝,不然过不去;
   首先最小公倍数的和,不考虑时间复杂度,
  求法:
   首先你需要知道有个这样的定理:如果 gcd(n,i)=1则 gcd(n,n-i)=1 (1<=i<=n)
     可得小于n的并与n互质的和为p*phi(p)/2;
         p=1的时候是特例需要特判+1;
    答案显然等于 n * (phi(g) * g / 2 + 1) g | n, g >= 1
         显然需要枚举n的因数,最常见sqrt(n)的写法,根据题目T*sqrt(n)显然超时;
    优化:
    首先你需要知道欧拉函数的两个积性函数的性质:

    欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n)。

若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。

   然后将n质因数分解,二进制枚举,这时你会发现万一有多个相同的质数会重复累加,所以将存不同质数,和质数的个数;
   在枚举的时候后面的指数跟前面的数不管如何乘必然互质,这就可以用到积性函数的第一个性质;
   在处理相同质数,用到第二个质数;
   如果p是质数,φ(p)=p-1;
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define inf 999999999
#define esp 0.00000000001
ll scan()
{
ll res = , ch ;
while( !( ( ch = getchar() ) >= '' && ch <= '' ) )
{
if( ch == EOF ) return << ;
}
res = ch - '' ;
while( ( ch = getchar() ) >= '' && ch <= '' )
res = res * + ( ch - '' ) ;
return res ;
}
const int MAXN=;
int fa[];
int si[],p;
ll ans;
int prime[MAXN],cnt;
bool vis[MAXN];
inline int Prime(int n)
{
cnt=;
memset(vis,,sizeof(vis));
for(int i=;i<n;i++)
{
if(!vis[i])
prime[cnt++]=i;
for(int j=;j<cnt&&i*prime[j]<n;j++)
{
vis[i*prime[j]]=;
if(i%prime[j]==)
break;
}
}
return cnt;
}
inline void dfs(ll fac,ll pos,ll x,ll oula)
{
if(pos==p)
{
ans+=oula*fac/;
ans%=mod;
return;
}
ll base=;
ll hh=;
for(int i=;i<=si[pos];i++)
{
dfs(fac*base,pos+,x,oula*hh);
base*=fa[pos];
hh*=fa[pos]-(i==?:);
}
}
int main()
{
ll x,y,z,i,t;
Prime(MAXN);
int T;
scanf("%d",&T);
while(T--)
{
memset(si,,sizeof(si));
scanf("%lld",&x);
ans=;
p=;
z=x;
for(i=;i<cnt&&prime[i]*prime[i]<=z;i++)
{
if(z%prime[i]==)
{
fa[p]=prime[i];
while(z%prime[i]==)
{
z/=prime[i];
si[p]++;
}
p++;
}
}
if(z>)
{
fa[p]=z;
si[p++]++;
}
dfs(,,x,);
printf("%lld\n",(x*(ans+))%mod);
}
return ;
}
   

51nod 1363 最小公倍数的和 欧拉函数+二进制枚举的更多相关文章

  1. 【51Nod 1363】最小公倍数之和(欧拉函数)

    题面 传送门 题解 拿到式子的第一步就是推倒 \[ \begin{align} \sum_{i=1}^nlcm(n,i) &=\sum_{i=1}^n\frac{in}{\gcd(i,n)}\ ...

  2. 51nod 1040 最大公约数之和 欧拉函数

    1040 最大公约数之和 题目连接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1040 Description 给 ...

  3. POJ2154 Color【 polya定理+欧拉函数优化】(三个例题)

    由于这是第一天去实现polya题,所以由易到难,先来个铺垫题(假设读者是看过课件的,不然可能会对有些“显然”的地方会看不懂): 一:POJ1286 Necklace of Beads :有三种颜色,问 ...

  4. 51nod 1239 欧拉函数之和(杜教筛)

    [题目链接] https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239 [题目大意] 计算欧拉函数的前缀和 [题解] 我们 ...

  5. 51nod 1040 最大公约数之和(欧拉函数)

    1040 最大公约数之和 题目来源: rihkddd 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   给出一个n,求1-n这n个数,同n的最大公约数的和.比如: ...

  6. [51Nod 1244] - 莫比乌斯函数之和 & [51Nod 1239] - 欧拉函数之和 (杜教筛板题)

    [51Nod 1244] - 莫比乌斯函数之和 求∑i=1Nμ(i)\sum_{i=1}^Nμ(i)∑i=1N​μ(i) 开推 ∑d∣nμ(d)=[n==1]\sum_{d|n}\mu(d)=[n== ...

  7. 51nod 1040最大公约数和(欧拉函数)

    1040 最大公约数之和 题目来源: rihkddd 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 给出一个n,求1-n这n个数,同n的最大公约数 ...

  8. 51Nod 1136 欧拉函数 Label:数论

    对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目.此函数以其首名研究者欧拉命名,它又称为Euler's totient function.φ函数.欧拉商数等.例如:φ(8) = 4(Phi( ...

  9. 51nod 1040 最大公约数的和 欧拉函数

    1040 最大公约数之和 题目来源: rihkddd 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 给出一个n,求1-n这n个数,同n的最大公约数 ...

随机推荐

  1. COGS 693. [SDOI2005]Antiprime数 唯一分解定理逆用

    693. Antiprime数 ★★   输入文件:antip.in   输出文件:antip.out   简单对比 时间限制:1 s   内存限制:128 MB 如果一个自然数n(n>=1), ...

  2. exe4j中"this executable was created with an evaluation version of exe4j"

    在使用exe4j时,如果您的exe4j没有注册,在运行有exe4j转换的*.jar为*.exe的可执行文件是会提示:"this executable was created with an ...

  3. ehcache 的HelloWorld实现(二)

    EhCache最新版本是3.X 本人一直用的是2.X 比较稳定 功能足够用: 所以还是用2.X版本: 我们新建一个Maven项目, pom.xml里引入 ehcache支持: <dependen ...

  4. Unity使用native读取streamingasset里文件

    需求是,使用native方式,读取apk包里的lua代码,读进c#,做解密 一准备unity工程 public class GameMain : MonoBehaviour { public cons ...

  5. 前端基础 & 初识CSS

    CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素.l 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). CSS语法 每个CS ...

  6. Python __setitem__()、__getitem__()、__delitem__()

    转载:http://blog.csdn.net/xhw88398569/article/details/48690163 __xxxitem__:使用 [''] 的方式操作属性时被调用 __setit ...

  7. T-SQL利用笛卡尔积累计、累加

    T-SQL利用笛卡尔积累计.累加 笛卡尔积 --原始数据 select templateid,needitem1Count from db_tank..TS_CardMain --累计数据 selec ...

  8. Java基础—访问权限控制

    Java中访问权限控制的作用: 为了使用户不要触碰那些他们不该触碰的部分,这些部分对于类内部的操作时必要的,但是它并不属于客户端程序员所需接口的一部分. 为了让类库设计者可用更改类的内部工作方式,而不 ...

  9. Python基础-常用的内置函数

    内置函数filter str = ['a', 'b', 'c', 'd'] def fansik(num): if num != "a": return num ret = fil ...

  10. 【转】jQuery插件之ajaxFileUpload

    转自:http://www.cnblogs.com/kissdodog/archive/2012/12/15/2819025.html 说在前头,本文出自上面的作者,只是以前存的一些网址不见了,怕以后 ...