关闭

POJ-2773 2分夹逼+DFS解容斥..

802人阅读 评论(0) 收藏 举报

      有了DFS解容斥问题的思路..这题不难想...若一个数x与所给的m互质..则说明x与h的GCD==1...将m因式分解,对于一个确定的上限...可以通过DFS对这些质因数解容斥求出当前上限下有多少个与m不互质的数...从而又能得到当前上限下有多少个与m互质的数...

      想到了这一步..就不难想到2的思路了...通过2分夹逼找到所需的数...并且数据范围m<=100000..在这个范围内因式分解..最多也不会超过6个质因数.{2,3,5,7,11,13}已经超过100000..显然时间上是绝对能秒杀的...

 

Program:

#include<iostream>
#include<string.h>
#include<stdio.h>
#define ll long long
using namespace std;
ll n,m,a[25],ans,p,t,h,l,r,mid; 
void DFS(ll i,ll w,ll k)
{      
       for (;i<=n;i++)
       if (a[i])
       {
             p=a[i]*w;
             h+=k*(mid/p);
             DFS(i+1,p,-k);
       }
       return;
}
int main()
{
       ll i;
       while (cin>>m>>t)
       { 
             n=0;
             for (i=2;i<=m;i++)
             if (m%i==0)
             {
                   while (m%i==0) m/=i;
                   a[++n]=i;
                   if (m==1) break;
             } 
             r=1;
             while (1)
             {
                   mid=r;
                   h=0;
                   DFS(1,1,1);
                   if (mid-h<t) r*=2;
                     else break;
             }
             l=1;
             while (r-l>1)
             {
                   mid=(l+r)/2;
                   h=0;
                   DFS(1,1,1);
                   if (mid-h>=t) r=mid;
                     else l=mid;
             }
             cout<<r<<endl;
       }
       return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:685398次
    • 积分:12250
    • 等级:
    • 排名:第1160名
    • 原创:620篇
    • 转载:3篇
    • 译文:0篇
    • 评论:178条
    最新评论