ZOJ
来源:互联网 发布:sql insert嵌套select 编辑:程序博客网 时间:2024/06/03 11:22
题目:就是现在给出一个数X, 1 < X <= 80000, 现在X是由至多三个质数通过加法和乘法组成的, 问有多少种这样的质数表达式
思路:主要有6种情况 P1P1+P2 P1+P2+P3P1*P2 P1*P2*P3P1*P2+P3
具体看代码注释
代码:
//#pragma comment(linker, "/STACK:1024000000,1024000000")#include<iostream>#include<algorithm>#include<cstdio>#include<cmath>#include<cstring>#include<string>#include<vector>#include<map>#include<set>#include<queue>#include<stack>#include<list>#include<numeric>using namespace std;#define LL long long#define ULL unsigned long long#define INF 0x3f3f3f3f#define mm(a,b) memset(a,b,sizeof(a))#define PP puts("*********************");template<class T> T f_abs(T a){ return a > 0 ? a : -a; }template<class T> T gcd(T a, T b){ return b ? gcd(b, a%b) : a; }template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}// 0x3f3f3f3f3f3f3f3f// 0x3f3f3f3fconst LL MOD=1000000007;const int maxn=5e5+50;const double PI=acos(-1.0);struct Complex{//复数结构体 double x,y; Complex(double _x=0.0,double _y=0.0){ x=_x; y=_y; } Complex operator-(const Complex &b)const{ return Complex(x-b.x,y-b.y); } Complex operator+(const Complex &b)const{ return Complex(x+b.x,y+b.y); } Complex operator*(const Complex &b)const{ return Complex(x*b.x-y*b.y,x*b.y+y*b.x); }};/**进行FFT和IFFT前的反转变换.*位置i和 (i二进制反转后位置)互换*len必须是2的幂*/void change(Complex y[],int len){ int i,j,k; for(i=1,j=len/2;i<len-1;i++){ if(i<j) swap(y[i],y[j]); k=len/2; while(j>=k){ j-=k; k/=2; } if(j<k) j+=k; }}/**做FFT*len必须为2^k形式,*on==1时是DFT,on==-1时是IDFT*/void fft(Complex y[],int len,int on){ change(y,len); for(int h=2;h<=len;h<<=1){ Complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h)); for(int j=0;j<len;j+=h){ Complex w(1,0); for(int k=j;k<j+h/2;k++){ Complex u=y[k]; Complex t=w*y[k+h/2]; y[k]=u+t; y[k+h/2]=u-t; w=w*wn;//旋转因子 } } } if(on==-1) for(int i=0;i<len;i++) y[i].x/=len;}bool isprime[maxn];int prime[maxn],tol;void make_prime(int n){ for(int i=0;i<=n;i++) isprime[i]=true; isprime[0]=isprime[1]=false; tol=0; for(int i=2;i<=n;i++){ if(isprime[i]) prime[tol++]=i; for(int j=0;j<tol;j++){ if(i*prime[j]<=n) isprime[i*prime[j]]=false; else break; if(i%prime[j]==0) break; } }}Complex P[maxn];Complex P1_P2[maxn];//P1+P2&&P1!=P2Complex P1P2[maxn];//P1*P2Complex P1_P2_P3[maxn];//P1+P2+P3&&P1!=P2Complex P1P2_P3[maxn];//P1*P2+P3bool isP1P2[maxn];int n=80000;int main(){ int X,len=1; while(len<160001) len<<=1; make_prime(n); for(int i=0;i<=n;i++) if(isprime[i]) P[i]=Complex(1,0); else P[i]=Complex(0,0); for(int i=n+1;i<len;i++) P[i]=Complex(0,0); fft(P,len,1); //P1+P2 for(int i=0;i<len;i++) P1_P2[i]=P[i]*P[i]; fft(P1_P2,len,-1); for(int i=2;i<=n;i++){ if(i%2==0&&isprime[i/2]) P1_P2[i].x-=1; P1_P2[i].x/=2; } for(int i=n+1;i<len;i++) P1_P2[i].x=0; //P1+P2+P3 fft(P1_P2,len,1); for(int i=0;i<len;i++) P1_P2_P3[i]=P1_P2[i]*P[i]; fft(P1_P2_P3,len,-1); fft(P1_P2,len,-1); //P1*P2 mm(isP1P2,false); for(int i=0;i<tol;i++) for(int j=i;j<tol;j++){ if((LL)prime[i]*prime[j]>n) break; int k=prime[i]*prime[j]; isP1P2[k]=true; } //P1*P2+P3 for(int i=0;i<=n;i++) if(isP1P2[i]) P1P2[i]=Complex(1,0); else P1P2[i]=Complex(0,0); for(int i=n+1;i<len;i++) P1P2[i]=Complex(0,0); fft(P1P2,len,1); for(int i=0;i<len;i++) P1P2_P3[i]=P1P2[i]*P[i]; fft(P1P2_P3,len,-1); while(~scanf("%d",&X)){ LL ans=0; //P1 if(isprime[X]) ans++; //P1+P2 if(X%2==0&&isprime[X/2]) ans++;//P1=P2 ans=(ans+(LL)(P1_P2[X].x+0.5)%MOD)%MOD;//P1!=P2 //P1+P2+P3 if(X%3==0&&isprime[X/3]) ans=(ans+1)%MOD;//P1=P2=P3 LL cnt=0; for(int i=0;i<tol&&2*prime[i]<X;i++) if(isprime[X-2*prime[i]]&&X!=3*prime[i]) cnt++; LL tmp=(LL)(P1_P2_P3[X].x+0.5); ans=(ans+cnt)%MOD; ans=(ans+(tmp-cnt)/3%MOD)%MOD; //P1*P2; if(isP1P2[X]) ans=(ans+1)%MOD; //P1*P2*P3 for(int i=0;i<tol&&prime[i]<X;i++) if(X%prime[i]==0&&isP1P2[X/prime[i]]){//一定要跳出去,不然会多算 ans=(ans+1)%MOD; break; } //P1*P2+P3 ans=(ans+(LL)(P1P2_P3[X].x+0.5)%MOD)%MOD; ans=(ans+MOD)%MOD; printf("%lld\n",ans); } return 0;}
阅读全文
0 0
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- es6新特性概览
- mysql 远程访问配置
- log4j打印mybatis执行sql,将占位符换成真实的参数输出
- java 数组
- FatFs模块系统应用指南
- ZOJ
- 《ECMAScript 6入门》笔记1
- 大话设计模式——装饰模式
- Http请求解析Json与图片(AlertDialog)提示框
- 通过application get set 数据
- 多态
- 洛谷P2059 [JLOI2013]卡牌游戏
- FatFs模块功能配置选项
- 第九章 删除表格行,定制Action按钮,MVC模式(二)