质数距离
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 1000010;
int primes[N], cnt;
bool st[N];
void init(int n)
{
memset(st, 0, sizeof st);
cnt = 0;
for (int i = 2; i <= n; i ++ )
{
if (!st[i]) primes[cnt ++ ] = i;
for (int j = 0; primes[j] * i <= n; j ++ )
{
st[i * primes[j]] = true;
if (i % primes[j] == 0) break;
}
}
}
int main(){
int l, r;
while (cin >> l >> r){
init(50000);
memset(st, 0, sizeof st);
for(int i=0;i<cnt;i++){
LL p= primes[i];
for(LL j=max(p*2,(l+p-1)/p*p);j<=r;j+=p)
st[j-l]=1;
}
cnt=0;
for (int i = 0; i <= r - l; i ++ )
if (!st[i] && i + l >= 2)
primes[cnt ++ ] = i + l;
if (cnt < 2) puts("There are no adjacent primes.");
else{
int minp = 0, maxp = 0;
for(int i=0;i+1<cnt;i++){
int d = primes[i + 1] - primes[i];
if (d < primes[minp + 1] - primes[minp]) minp = i;
if (d > primes[maxp + 1] - primes[maxp]) maxp = i;
}
printf("%d,%d are closest, %d,%d are most distant.\n",
primes[minp], primes[minp + 1],
primes[maxp], primes[maxp + 1]);
}
}
}
阶乘分解
cnt(x)=[n/(x^1)]+[n/(x^2)]+[n/(x^3)]+...(直到x的次方大于n)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1000010;
int primes[N], cnt;
bool st[N];
void init(int n)
{
for (int i = 2; i <= n; i ++ )
{
if (!st[i]) primes[cnt ++ ] = i;
for (int j = 0; primes[j] * i <= n; j ++ )
{
st[i * primes[j]] = true;
if (i % primes[j] == 0) break;
}
}
}
int main()
{
int n;
cin >> n;
init(n);
for (int i = 0; i < cnt; i ++ )
{
int p = primes[i];
int s = 0;
for (int j = n; j; j /= p) s += j / p;
printf("%d %d\n", p, s);
}
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define per(i,s,t) for(int i=s;i>=t;i--)
#define ms0(ar) memset(ar,0,sizeof ar)
#define ms1(ar) memset(ar,-1,sizeof ar)
#define Ri(x) scanf("%d",&x)
#define Rii(x,y) scanf("%d%d",&x,&y)
#include<cstdio>
using namespace std;
typedef long long ll;
ll sum(int n) {
if(n<=1) return n;
ll ans=0;
for(ll l=1,r;l<=n;l=r+1) {
r=n/(n/l);
ans+=(n/l)*(l+r)*(r-l+1)/2;
}
return ans;
}
int main() {
int x,y;
scanf("%d",&x);
printf("%lld\n",sum(sum(x)));
return 0;
}
杜教筛暴力过
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#define int long long
using namespace std;
const int N=2e6+5;
int prime[N],tot;
bool isprime[N];
int mu[N],smu[N];
int sigma[N],ssigma[N];
map<int,int> memomu,memosigma;
inline void sieve(int n)
{
int i,j;
memset(isprime+1,1,sizeof(bool)*n);
isprime[1]=0;mu[1]=sigma[1]=1;
for(i=1;i<=n;i++)
{
if(isprime[i])
prime[++tot]=i,mu[i]=-1,sigma[i]=i+1;
for(j=1;j<=tot&&prime[j]*i<=n;j++)
{
isprime[i*prime[j]]=0;
if(i%prime[j]==0)
{
sigma[i*prime[j]]=sigma[i]*sigma[prime[j]]-sigma[i/prime[j]]*prime[j];
break;
}
mu[i*prime[j]]=-mu[i];
sigma[i*prime[j]]=sigma[i]*sigma[prime[j]];
}
}
for(i=1;i<=n;i++)
smu[i]=smu[i-1]+mu[i];
for(i=1;i<=n;i++)
ssigma[i]=ssigma[i-1]+sigma[i];
return;
}
int n;
int Smu(int x)
{
if(x<=2000000)
return smu[x];
if(memomu.find(x)!=memomu.end())
return memomu[x];
int res=1,l,r;
for(l=2;l<=x;l=r+1)
{
r=x/(x/l);
res-=(r-l+1)*Smu(x/l);
}
return memomu[x]=res;
}
int Ssigma(int x)
{
if(x<=2000000)
return ssigma[x];
if(memosigma.find(x)!=memosigma.end())
return memosigma[x];
int res=x*(x+1)/2,l,r;
for(l=2;l<=x;l=r+1)
{
r=x/(x/l);
res-=(Smu(r)-Smu(l-1))*Ssigma(x/l);
}
return memosigma[x]=res;
}
signed main()
{
int l,r;
sieve(2000000);
scanf("%lld",&l);
r=0;
printf("%lld\n",Ssigma(Ssigma(l)));
}