BZOJ3944: Sum
生活随笔
收集整理的這篇文章主要介紹了
BZOJ3944: Sum
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
BZOJ3944: Sum
Description
Input
一共T+1行 第1行為數(shù)據(jù)組數(shù)T(T<=10) 第2~T+1行每行一個非負(fù)整數(shù)N,代表一組詢問Output
一共T行,每行兩個用空格分隔的數(shù)ans1,ans2Sample Input
61
2
8
13
30
2333
Sample Output
1 12 0
22 -2
58 -3
278 -3
1655470 2
題解Here! 這個應(yīng)該算是杜教篩的模板題了。 雖然我并不知道杜教是誰。。。 放上幾篇博客吧,這里懶得寫了。。。 鏈接在此! 實(shí)在不行就直接背板子嘛。。。 附代碼: #include<iostream> #include<algorithm> #include<cstdio> #include<map> #define MAXN 1700010 using namespace std; map<int,long long> sum; int k=0,prime[MAXN],mu[MAXN]; bool np[MAXN]; inline long long read(){long long date=0,w=1;char c=0;while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}return date*w; } void make(){int m=MAXN-10;mu[1]=1;for(int i=2;i<=m;i++){if(!np[i]){prime[++k]=i;mu[i]=-1;}for(int j=1;j<=k&&prime[j]*i<=m;j++){np[prime[j]*i]=true;if(i%prime[j]==0)break;mu[prime[j]*i]=-mu[i];}}for(int i=2;i<=m;i++)mu[i]+=mu[i-1]; } long long solve_mu(long long n){if(n<=MAXN-10)return mu[n];if(sum.count(n))return sum[n];long long ans=1;for(long long i=2,last;i<=n;i=last+1){last=n/(n/i);ans-=1LL*(last-i+1)*solve_mu(n/i);}sum[n]=ans;return ans; } long long solve_phi(long long n){long long ans=0;for(long long i=1,last;i<=n;i=last+1){last=n/(n/i);ans+=1LL*(n/i)*(n/i)*(solve_mu(last)-solve_mu(i-1));}return ((ans-1>>1)+1); } int main(){make();int t=read();while(t--){long long n=read();printf("%lld %lld\n",solve_phi(n),solve_mu(n));}return 0; }
?
轉(zhuǎn)載于:https://www.cnblogs.com/Yangrui-Blog/p/9581583.html
總結(jié)
以上是生活随笔為你收集整理的BZOJ3944: Sum的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL中查询时间最大的一条记录
- 下一篇: 关于echars中雷达图的一些配置