题目链接:HDU 1299 传送门
题意:
求方程1/x+1/y=1/n的解的个数 1/3+1/2 与1/2+1/3看作是一组解。
分析:
1/x+1/y = 1/n 设y = n + k;
==>1/x + 1/(n+k)=1/n;
==>x = n^2/k + n;
因为x为整数,k就是n^2的约数。
代码如下:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 1e7+10; typedef long long LL; int p[maxn/10],cnt; bool vis[maxn]; int fac[1000],tot; void init(){ cnt=0; memset(vis,0,sizeof(vis)); for(int i=2;i<maxn;i++){ if(!vis[i]){ p[cnt++]=i; for(int j=i+i;j<maxn;j+=i) vis[j]=1; } } } LL get(LL x){ tot=0; memset(fac,0,sizeof(fac)); for(int i=0;i<cnt&&p[i]*p[i]<=x;i++){ if(x%p[i]==0){ while(x%p[i]==0) fac[tot]++,x/=p[i]; tot++; } } if(x>1) fac[tot++]=1; LL ans = 1; for(int i=0;i<tot;i++) ans=ans*(2*fac[i]+1); return ans ; } int main() { init(); int t,cas=1; scanf("%d",&t); while(t--){ LL n; scanf("%I64d",&n); printf("Scenario #%d:\n%I64d\n\n",cas++,(get(n)+1)/2); } return 0; }
题目链接:SPOJ - KPEQU 传送门
题意:
同上题差不多不过n换成了n!,因此需要用到高精度以及n!的素因子分解
import java.math.BigInteger; import java.util.Scanner; public class Main { static int cnt ; static int[] pri =new int[10010]; static boolean[] vis = new boolean[10010]; public static void init(){ cnt=0; for(int i=0;i<10010;i++) vis[i] = false; for(int i=2;i<10010;i++){ if(!vis[i]){ pri[cnt++]=i; for(int j=i+i;j<10010;j+=i) vis[j]=true; } } } public static int calc(int n,int p){ if(n<p) return 0; else return calc(n/p,p)+n/p; } public static void main(String[] args) { // TODO Auto-generated method stub init(); Scanner cin = new Scanner(System.in); while(cin.hasNext()){ int n=cin.nextInt(); if(n==0) break; BigInteger ans = BigInteger.ONE; for(int i=0;i<cnt&&pri[i]<=n;i++){ int tmp = calc(n,pri[i]); tmp = tmp*2+1; ans=ans.multiply(BigInteger.valueOf(tmp)); } System.out.println(ans); } } }