BZOJ-3944-杜教筛
来源:互联网 发布:c语言用函数判断闰年 编辑:程序博客网 时间:2024/06/04 20:03
题目大意:
求
题目解析:
杜教筛科普:
关于杜教筛:
求
我们定义
如果
前面那项需要快速求解,最好O(1),后面那项可以dfs求解;
AC代码:
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<map>using namespace std;#define N 5000000#define LL long longint T,n;int p[N+3],prime[N+3];LL phi[N+3],mu[N+3];map <int,LL> ansphi,ansmu;void get(){ phi[1]=mu[1]=1; for (int i=2;i<=N;++i) { if (!p[i]) { prime[++prime[0]]=i; phi[i]=i-1; mu[i]=-1; } for (int j=1;j<=N&&i*prime[j]<=N;++j) { p[i*prime[j]]=1; if (i%prime[j]==0) { phi[i*prime[j]]=phi[i]*prime[j]; mu[i*prime[j]]=0; break; } else { phi[i*prime[j]]=phi[i]*phi[prime[j]]; mu[i*prime[j]]=-mu[i]; } } } for (int i=1;i<=N;++i) phi[i]+=phi[i-1],mu[i]+=mu[i-1];}LL sumphi(LL n){ if (n<N) return phi[n]; if (ansphi[n]) return ansphi[n]; LL tmp; if (n&1) tmp=(n+1)/2*n; else tmp=n/2*(n+1); for (int i=2,j=0;i<=n;i=j+1) { j=n/(n/i); tmp-=sumphi(n/i)*(LL)(j-i+1); if (j==n) break; } ansphi[n]=tmp; return tmp;}LL summu(int n){ if (n<=N) return mu[n]; if (ansmu[n]) return ansmu[n]; LL tmp=1; for (int i=2,j=0;i<=n;i=j+1) { j=n/(n/i); tmp-=summu(n/i)*(LL)(j-i+1); if (j==n) break; } ansmu[n]=tmp; return tmp;}int main(){ get(); scanf("%d",&T); while (T--) { scanf("%lld",&n); printf("%lld %lld\n",sumphi(n),summu(n)); }}
阅读全文
0 0
- bzoj 3944: Sum 杜教筛
- bzoj 3944: Sum 杜教筛
- 【BZOJ 3944】sum 杜教筛
- bzoj 3944 sum 杜教筛
- bzoj 3944 Sum 杜教筛
- [BZOJ 3944]Sum:杜教筛
- BZOJ-3944-杜教筛
- BZOJ 3944: Sum 杜教筛
- bzoj 3944 Sum 杜教筛
- [BZOJ]3944 Sum 杜教筛
- [杜教筛模板] BZOJ 3944 Sum
- bzoj 3944: Sum (杜教筛)
- BZOJ 3944: Sum (杜教筛模板)
- BZOJ 3944 Sum 数论
- BZOJ 3944: Sum
- BZOJ 3944 Sum
- bzoj 3944 Sum
- [BZOJ]3944: Sum
- Android:你要的WebView与 JS 交互方式 都在这里了
- Oracle数据库sys和system的默认密码
- leetcode 667. Beautiful Arrangement II
- Codeforces 125E MST Company(k度限制生成树)
- win10 浏览器不能上网但是QQ等其他软件都能上网
- BZOJ-3944-杜教筛
- ec3文件后缀
- 如何把得到的结果集放到map集合中+取得列和值ResultSetMetaData
- matlab中各种范数求解norm
- C/C++编程教训----函数内静态类对象初始化非线程安全(C++11之前)
- Android:你不知道的 WebView 使用漏洞
- 模拟网商订单生成器
- softmax分类算法原理(用python实现)
- D