HDU5382 GCD?LCM!
来源:互联网 发布:网络映射有什么用 编辑:程序博客网 时间:2024/06/04 01:22
题目链接
题目大意
令:
题解
又是这种一看题解就觉得自己也能推的数论题….
首先看数据范围,目测是先预处理所有答案然后
那么预处理时肯定要考虑
设
比较上面得到的这个东西左边那个二重和式和
然后再来推
其中
喜闻乐见的是
具体来说是这样的:
对素数
考虑筛到
设
设
那么
所以
然后可以
代码
#include<cstdio>#include<cstring>const int N=1e6+5,mod=258280327;int prime[N],H[N],G[N],F[N],S[N];bool is_prime[N];void sieve(){ memset(is_prime,true,N); H[1]=1; for(int i=2,tot_prime=0;i<N;++i){ if(is_prime[i]){ prime[tot_prime++]=i; H[i]=2; } for(int j=0,prod;j<tot_prime&&(prod=i*prime[j])<N;++j){ is_prime[prod]=false; if(i%prime[j])H[prod]=H[i]<<1; else{ H[prod]=H[i]; break; } } }}inline void mod_add(int &a,int b){ if((a+=b)>=mod)a-=mod;}void solve(){ sieve(); memset(G,0,N<<2); for(int d=1;d<N;++d){ for(int k=1,n;(n=k*d)<N;++k){ mod_add(G[n],H[k-1]); } } F[1]=S[1]=1; for(int n=2;n<N;++n){ F[n]=((F[n-1]+(n<<1)-1-G[n-1])%mod+mod)%mod; if((S[n]=S[n-1]+F[n])>=mod)S[n]-=mod; }}inline void rd(int &res){ res=0; char c; while(c=getchar(),c<48); do res=(res<<3)+(res<<1)+(c^48); while(c=getchar(),c>47);}int main(){ int cas,n; rd(cas); solve(); while(cas--){ rd(n); printf("%d\n",S[n]); } return 0;}/* Jul.05.16 Tags:number theory,sieve Submissions:1 Memory(KB) 18340 Time(ms) 234 Length(Bytes) 990*/
0 0
- HDU5382 GCD?LCM!
- 【hdu5382】GCD?LCM! 题解
- hdu5382 GCD?LCM! 推公式+埃式筛法
- gcd,lcm
- gcd & lcm
- LCM GCD
- GCD LCM
- lcm/gcd
- gcd & lcm
- GCD LCM
- 【GCD&LCM】
- gcd && lcm
- gcd,lcm 汇编版本
- gcd,lcm 汇编版本
- zoj 1577 GCD & LCM
- ZOJ 1577 GCD & LCM
- gcd 与 lcm
- ZOJ 1577 GCD & LCM
- 跟我学Android之七 资源文件
- 修改UITextField的placeholder颜色
- 关于ArrayList与BigInteger
- 求矩阵中最大(小)值并返回其行列号
- hdu2073 无限的路 瞎搞
- HDU5382 GCD?LCM!
- Python random模块
- PostgreSQL笔记整理
- java对象序列化和反序列化
- python下如何安装.whl包?
- Java - Map
- IGC data
- java中定义16十六进制数组
- struts2环境搭建