您的位置:首页 > 其它

上海大学oj 膜一下将带给你好运(欧拉函数变形)

2017-07-13 14:18 162 查看
膜一下将带给你好运

发布时间: 2017年7月9日 20:20 最后更新: 2017年7月10日 21:12 时间限制: 1000ms 内存限制: 128M

描述

欧拉函数ϕ(n)被定义1~n中与n互质的数的个数。例如ϕ(5)=4,因为1,2,3,4这四个数字与5互质。

定义f函数:

f(n)=∑i=233n−233ϕ(i)∗[n/i]

其中[n/i]表示n除以i所得到的商

输入

第一行一个整数T,表示测试组数。对于每组数据,输入一行,包含一个数字n,466<=n<=108

输出

每组数据输出一行,表示函数值f(n)对1000000007取模

样例输入1 复制

2

1068

972

样例输出1

293824

222698

分析:有两种方法;

   1.推公式,有Σ(i:1-n)Φ(n)(n/i) = n(n+1)/2,前后233可以欧拉公式暴力去除;

   2.直接枚举n/i,不超过sqrt(n)个,求一下欧拉函数前缀

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9+7;

ll eular(ll n)//求n的欧拉函数
{
int i;
int eu = n;//欧拉函数
for(i = 2; i <= sqrt(n); i++)
{
if(n % i == 0)//质因子
{
eu = eu / i* (i-1);
while(n % i == 0)
n /= i;//避免再次累加
}
}
if(n > 1) eu = eu / n* (n-1);//本身就是 质数
return eu;
}

int main()
{
int t;
scanf("%d",&t);
while(t--)
{

ll n;
scanf("%lld",&n);
ll ans=n*(n+1)/2%mod;
for(int i=1;i<=232;i++)
{

ans=(ans-eular(i)*(n/i)+mod)%mod;
}
for(int i=n;i>=n-232;i--)
{
ans=(ans-eular(i)*(n/i)+mod)%mod;
}
cout<<ans<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: