您的位置:首页 > 产品设计 > UI/UE

Problem D - Farey Sequence Length 2015 ACM/ICPC Greater New York Region

2016-05-18 17:41 483 查看
预处理计算for any n, 比n小且互质的数的个数。我是翻模板才发现有个Eular函数可以直接算的,难得人品爆发一回。

因为N的 farey sequence包括了N-1的farey sequence,所以可以利用前缀和,注意N=1要单独处理。

#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<string>
#include<cmath>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<cstring>
#include<vector>
#include<queue>
#include<map>

using namespace std;

const int maxn=10010;
int P;
int N;
int K;
vector<int>fac[maxn];
int facnum[maxn];
int sum[maxn];
void findfac(int n)
{
fac
.push_back(1);
for(int i=2;i<sqrt(n)+1;i++)
{
if((n%i)==0)
{
fac
.push_back(i);
if(n/i<i)
{
fac
.push_back(n/i);
}

}

}
}

int eular(int n)
{
int ret=1;
for(int i=2;i*i<=n;i++)
{
if((n%i)==0)
{
n/=i;
ret*=i-1;
while(n%i==0)
{

n/=i;
ret*=i;
}
}
}
if(n>1) ret*=n-1;
return ret;

}
void init()
{
memset(facnum,0,sizeof(facnum));
memset(sum,0,sizeof(sum));
facnum[1]=2;
sum[1]=2;
for(int i=2;i<maxn;i++)
{
facnum[i]=eular(i);
sum[i]=sum[i-1]+facnum[i];
}
}
int main()
{
//freopen("input.txt","r",stdin);
//cout<<eular(2)<<endl;
init();
scanf("%d",&P);
for(int ca=0;ca<P;ca++)
{
scanf("%d %d",&K,&N);
printf("%d %d\n",K,sum
);

}
//cout<<"aa"<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: