zzyzzy12

大数据搬砖狗...

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

      有了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;
}


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kk303/article/details/7377856
个人分类: 组合数学
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭