bzoj 4916: 神犇和蒟蒻 杜教筛
来源:互联网 发布:怎么在淘宝上卖小电影 编辑:程序博客网 时间:2024/06/05 08:52
题意
求
n<=1e9,答案模1e9+7
分析
md第一问是什么鬼???
第二问想到是杜教筛(因为不会洲阁筛),但是没想到用哪个函数和f卷起来。
其实考虑到
容易发现左边等于
右边的话,化简一下可以得到
合并一下
直接上分块大法即可。
代码
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<map>using namespace std;typedef long long LL;const int N=10000005;const int MOD=1000000007;int n,s[N],phi[N],prime[N/10],tot;bool not_prime[N];map<int,int> w;void get_prime(int n){ phi[1]=1; for (int i=2;i<=n;i++) { if (!not_prime[i]) prime[++tot]=i,phi[i]=i-1; for (int j=1;j<=tot&&i*prime[j]<=n;j++) { not_prime[i*prime[j]]=1; if (i%prime[j]==0) { phi[i*prime[j]]=phi[i]*prime[j]; break; } phi[i*prime[j]]=phi[i]*(prime[j]-1); } } for (int i=1;i<=n;i++) s[i]=(s[i-1]+(LL)i*phi[i]%MOD)%MOD;}int solve(int n){ if (n<=10000000) return s[n]; if (w[n]) return w[n]; int ans=0; for (int i=2,last;i<=n;i=last+1) { last=n/(n/i); ans=(ans+(LL)((LL)last*(last+1)/2-(LL)i*(i-1)/2)*solve(n/i)%MOD)%MOD; } ans=((LL)n*(n+1)%MOD*(n*2+1)%MOD*166666668%MOD-ans+MOD)%MOD; w[n]=ans; return ans;}int main(){ puts("1"); get_prime(10000000); scanf("%d",&n); printf("%d",solve(n)); return 0;}
阅读全文
0 0
- bzoj 4916 神犇和蒟蒻
- BZOJ 4916 神犇和蒟蒻
- bzoj 4916: 神犇和蒟蒻
- BZOJ 4916: 神犇和蒟蒻 杜教筛 数学
- [杜教筛] BZOJ 4916 神犇和蒟蒻
- bzoj 4916: 神犇和蒟蒻 杜教筛
- BZOJ 4916 神犇和蒟蒻(杜教筛)
- bzoj 1303 |前缀和
- [杜教筛 约数个数前缀和] BZOJ 4176 Lucas的数论
- BZOJ 4636: 蒟蒻的数列
- BZOJ 4636 蒟蒻的数列
- BZOJ蒟蒻百年挖坑计划
- BZOJ-2337-XOR和路径
- bzoj 3398 牡牛和牝牛
- bzoj 2257 瓶子和燃料
- BZOJ 1218 二维前缀和
- bzoj 2956: 模积和
- [BZOJ]1056 和 1862 splay
- Android中 RXAndorid 与 MVP 模式的使用
- Qt向导简单使用(QWizard及QWizardPage)
- html基础
- rc与deployment的区别
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.3关键字(4.3.4-4.3.6)
- bzoj 4916: 神犇和蒟蒻 杜教筛
- GitHub使用教程for Eclipse
- 使用MapReduce实现寻找共同好友的案例
- cart2pol函数
- C语言实现两个复数相加
- Android简单自定义圆形Imageview
- IDEA将web项目打成war包
- 使用腾讯优图SDK,实现人脸识别、身份证OCR识别
- jfinal表单文件上传