2018-ACM-ICPC-沈阳赛区网络赛-G. Spare Tire-容斥-[1,n]与m互质的数的平方和

14 篇文章 0 订阅

2018-ACM-ICPC-沈阳赛区网络赛-G. Spare Tire-容斥-[1,n]与m互质的数的平方和

【Description】

A sequence of integer {an}\lbrace a_n \rbrace{an} can be expressed as:

>an={>0,>2,>3an1an22+n+1,n=0n=1n>1>>> > a n = { > 0 , n = 0 > 2 , n = 1 > 3 ∗ a n − 1 − a n − 2 2 + n + 1 , n > 1 >> >

Now there are two integers nnn and mmm. I'm a pretty girl. I want to find all 
b1,b2,b3⋯bpb_1,b_2,b_3\cdots b_pb1,b2,b3⋯bp that 1≤bi≤n1\leq b_i \leq n1≤bi≤n
and bib_ibi is relatively-prime with the integer mmm. And then calculate:

>i=1pabi> > ∑ i = 1 p a b i >

But I have no time to solve this problem because I am going to date my boyfriend
soon. So can you help me?

【Input】

Input contains multiple test cases ( about 150001500015000 ). Each case contains 
two integers nnn and mmm.1≤n,m≤10^8.

【Output】

 For each test case, print the answer of my question(after mod 1,000,000,007).

【Examples】

Sample Input

4 4

Sample Output

14

【Problem Description】

给你an的递推式。设[1,n]内与m互质的数为p1,p2,...,pk,求

>ap1+ap2++apk> > a p 1 + a p 2 + ⋯ + a p k >

【Solution】

根据递推式求an通项公式:

>2(anan1)=an1an2+2n+2>bn=anan1>2bn=bn1+2n+2>4n2(bn2n)=bn1(2n2)>bn2nbn12(n1)=12(n2)b12=a1a02=0>bn2n=0,bn=2n,anan1=2n>a2a1=2×2>a3a2=2×3>a4a3=2×4>>anan1=2×n>ana1=2×(2+3++n)>an=2×(1+2+3++n)=n×(n+1)>> > 2 ( a n − a n − 1 ) = a n − 1 − a n − 2 + 2 n + 2 > 令 b n = a n − a n − 1 > 则 2 b n = b n − 1 + 2 n + 2 > 两 边 同 时 减 4 n 得 : 2 ( b n − 2 n ) = b n − 1 − ( 2 n − 2 ) > b n − 2 n b n − 1 − 2 ( n − 1 ) = 1 2 ( n ≥ 2 ) b 1 − 2 = a 1 − a 0 − 2 = 0 > 发 现 b n − 2 n = 0 , b n = 2 n , 即 a n − a n − 1 = 2 n > a 2 − a 1 = 2 × 2 > a 3 − a 2 = 2 × 3 > a 4 − a 3 = 2 × 4 > … > a n − a n − 1 = 2 × n > 上 式 全 部 相 加 得 : a n − a 1 = 2 × ( 2 + 3 + ⋯ + n ) > a n = 2 × ( 1 + 2 + 3 + ⋯ + n ) = n × ( n + 1 ) >>

则题目要 求的为:

>p21+p22++p2k+p1+p2++pk> > p 1 2 + p 2 2 + ⋯ + p k 2 + p 1 + p 2 + ⋯ + p k >

就是[1,n]内与m互质的数的平方和+其和。
转换一下,转换为[1,n]的和+平方和-[1,n]中与m不互质的数的平方和+其和。
然后再利用容斥原理即可求得答案,不会的先做一下下面这道题。题解:

HDU-4135-容斥求[a,b]内与n互质的数的个数

如果懂了,下面就简单了。
对于m的每个质因子q1,q2,q3,...,qt,假设n=12,m=12,则质因子为23.
则n以内能被2整除的数为:24681012。
其平方和:

>22+42+62+82+102+122>=2(12+22+32+42+52+62)>2×12/2n> > 2 2 + 4 2 + 6 2 + 8 2 + 10 2 + 12 2 >= 2 ( 1 2 + 2 2 + 3 2 + 4 2 + 5 2 + 6 2 ) > 就 等 于 2 × 前 12 / 2 项 的 平 方 和 。 利 用 前 n 项 平 方 和 公 式 即 可 求 出 来 。 >

对于每一个的m的质因数,都可以利用上面的方法将n以内能被qi整除的数的平方和求出来,最后利用容斥原理的
奇加偶减求出[1,n]内不与m互质的数的平方和。
他们的和不用多说,在求平方和的时候顺便求一下就好。

最后别忘了取模,以及除法取模的特殊性。

【Code】

/*
 * @Author: Simon 
 * @Date: 2018-09-10 19:22:24 
 * @Last Modified by: Simon
 * @Last Modified time: 2018-09-10 21:11:01
 */
#include<bits/stdc++.h>
using namespace std;
typedef int Int;
#define int long long
#define INF 0x3f3f3f3f
#define maxn 100005
const int mod=1e9+7;
vector<int>fac;
void get_fac(int n)//求质因数
{
    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            fac.push_back(i);
            while(n%i==0) n/=i;
        }
    }
    if(n>1) fac.push_back(n);
}
int cal(int n,int ans)//求前n项平方和 和 前n项和,  ans为质因数。
{
    ans%=mod;
    int t1=n,t2=n+1,t3=2*n+1;
    if(t1%2==0) t1/=2;
    else t2/=2;
    if(t1%3==0) t1/=3;
    else if(t2%3==0) t2/=3;
    else t3/=3;

    int ans1=(ans*ans)%mod;
    ans1=(ans1*t1)%mod;ans1=(((ans1*t2)%mod)*t3)%mod;
    t1=n,t2=n+1;
    if(t1%2==0) t1/=2;
    else t2/=2;
    int ans2=(ans*t2)%mod;ans2=(ans2*t1)%mod;
    return (ans1+ans2)%mod;
}
int solve(int r)//容斥
{
    int sum=0;
    for(int i=1;i<(1<<fac.size());i++)
    {
        int ans=1,num=0;
        for(int j=0;j<fac.size();j++)
        {
            if(i&(1<<j))
            {
                ans=(ans*fac[j])%mod;
                num++;
            }
        }
        if(num&1) sum=(sum+cal(r/ans,ans))%mod;
        else sum=(sum-cal(r/ans,ans)+mod)%mod;
    }
    return sum%mod;
}
Int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m;
    while(cin>>n>>m)
    {
        fac.clear();
        get_fac(m);
        int sum=cal(n,1);
        cout<<(sum-solve(n)+mod)%mod<<endl;
    }
    cin.get(),cin.get();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值