SRM 691 Undiv2

16 篇文章 0 订阅
10 篇文章 0 订阅

s(i)表示第二个不能整除i的数。求1~n所有s(i)的和(1<=n<=1000,000,000).

思路

<1>显然对于一个X如果第一个不能整除它的数为z(X)所以lcm(1,2,…z(X)-1)必为X的一个因子
<2>同理对于一个X如果前两个不能整除它的数分别为z(X),s(X),lcm(1,2,…z(X)-1,z(x)+1,…s(x)-2,s(x)-1)必为X的一个因子,于是直接枚举即可z(i),s(i)即可;
<3>对于每组z(i),s(i)可以得到m=lcm(1,2,…z(i)-1,z(i)+1,…s(i-2),s(i-1))m的贡献为n/m;有因为n/m中有一些数可以被lcm(m,s(i))和lcm(m,z(i))整除所以要出去
<4>很容易得到在lcm(1,2,…z(X)-1)<=1e9时z(X)小于23于是S(x)小于25;

#include <bits/stdc++.h>
using namespace std;
class Undiv2 {
public:
    int gcd(int a,int b){return b?gcd(b,a%b):a;}
    int lcm(int a,int b){return a/gcd(a,b)*b;}
    long long getsum(int n){
        long long ans=0;
        for(int i=3;i<30;i++)//enumerate s(i) 
        for(int j=2;j<i;j++){//enumerate first num which can't divide X z(i);
            int m=1;
            for(int k=2;k<i;k++)if(k!=j)m=lcm(m,k);
            // X must be divided by m 
            // m=lcm(1,2,...z(i)-1,z(i)+1,...s(i-2),s(i-1))
            int a=lcm(i,m),b=lcm(j,m),c=lcm(m,lcm(i,j));
            ans+=i*(n/m-n/a-n/b+n/c);
        }return ans;
    }
};
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值