Codeforces 235E. Number Challenge DP
dp(a,b,c,p) = sigma ( dp(a/p^i,b/p^j,c/p^k) * ( 1+i+j+k) )
表示用小于等于p的素数去分解的结果有多少个
import java.util.*; public class CF235E { class Triple { Triple(){} Triple(int _x,int _y,int _z) { this.x=_x; this.y=_y; this.z=_z; this.sort(); } public int x,y,z; void sort() { if(this.z<this.y) { int t = this.z; this.z=this.y; this.y=t; } if(this.z<this.x) { int t=this.x; this.x=this.z; this.z=t; } if(this.y<this.x) { int t=this.x; this.x=this.y; this.y=t; } } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + getOuterType().hashCode(); result = prime * result + x; result = prime * result + y; result = prime * result + z; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Triple other = (Triple) obj; if (!getOuterType().equals(other.getOuterType())) return false; if (x != other.x) return false; if (y != other.y) return false; if (z != other.z) return false; return true; } private CF235E getOuterType() { return CF235E.this; } } int a,b,c; final int mod = 1073741824 ; int[] primes = new int[350]; int pn=0; boolean[] vis = new boolean[2200]; Map[] map = new Map[333]; void init() { for(int i=2;i<=2100;i++) { if(vis[i]==false) { primes[pn++]=i; for(int j=2*i;j<=2100;j+=i) vis[j]=true; } } for(int i=0,j=pn-1;i<=j;i++,j--) { int t=primes[i]; primes[i]=primes[j]; primes[j]=t; } for(int i=0;i<333;i++) map[i]=new HashMap<Triple,Integer>(); } long gao(int deep,Triple tri) { if(deep==pn) return 1; if(map[deep].get(tri)!=null) return (long) map[deep].get(tri); long ret=0; int p=primes[deep]; for(int x=tri.x,i=0;x!=0;x/=p,i++) { for(int y=tri.y,j=0;y!=0;y/=p,j++) { for(int z=tri.z,k=0;z!=0;z/=p,k++) { ret+=gao(deep+1,new Triple(x,y,z))*(i+j+k+1)%mod; if(ret>=mod) { ret-=mod; } } } } map[deep].put(tri, ret); return ret; } CF235E(){ init(); Scanner in = new Scanner(System.in); a=in.nextInt(); b=in.nextInt(); c=in.nextInt(); System.out.println(gao(0,new Triple((int)a,(int)b,(int)c))); } public static void main(String[] args) { new CF235E(); } }