设为首页 加入收藏

TOP

HDU 3641 Treasure Hunting (素数拆分)
2015-07-20 18:02:35 来源: 作者: 【 】 浏览:2
Tags:HDU 3641 Treasure Hunting 素数拆分


题意:有N个ai,bi,M=a1^b1*a2^b2*a3^b3…*an^bn ,求最小的 x 使得 x! % M ==0.


思路:把M分成多个素数相乘,num[i] 记录素数 i 的个数,然后二分找到x,若 x! 中所有 i 的个数满足>=num[i]

即为答案。


#include
  
   
#include
   
     #include
    
      #include
     
       #include
       #include
       
         #include
        
          #include 
         
           #include 
          
            #include
           
             #include
            
              using namespace std; #define INF 1e8 #define eps 1e-8 #define LL long long #define maxn 100105 #define mod 1000000009 int prime[25]={2,3,5,7,11,13,17,19,23,29,31, 37,41,43,47,53,59,61,67,71,73,79,83,89,97}; __int64 num[105]; void Cal(__int64 a,__int64 b)//计算素数i的个数num[i] { for(int i=0;i<25;i++) { while(a%prime[i]==0) { a/=prime[i]; num[prime[i]]+=b; } } } __int64 find(int i,__int64 x)//计算x!中i的个数 { __int64 ans=0; while(x) { x/=i; ans+=x; } return ans; } bool ok(__int64 x) { for(int i=0;i<25;i++) { if(num[prime[i]]) { __int64 tmp=find(prime[i],x); if(tmp
             
              >1; if(ok(mid)) { ans=mid; r=mid-1; } else l=mid+1; } printf("%I64d\n",ans); } return 0; }
             
            
           
          
         
        
       
     
    
   
  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu 4857 逃生 拓扑排序+优先队列.. 下一篇HDU 2163 Palindromes

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: