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

膜一下将带给你好运
发布时间: 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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值