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;
}
};