Advertisement
Guest User

Untitled

a guest
Jul 28th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.62 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<algorithm>
  3. #include<vector>
  4.  
  5. using namespace std;
  6.  
  7. char p[1000005];
  8. int pr[80000];
  9.  
  10. int gene(int n)
  11. {
  12.     int i,j;
  13.     for(i=2;i*i<=n;i++)
  14.         if(!p[i])
  15.             for(j=i*i;j<=n;j+=i)
  16.                 p[j]=1;
  17.     j=0;
  18.     for(i=2;i<=n;i++)
  19.         if(!p[i])
  20.             pr[j++] = i;
  21.     return j;
  22. }
  23.  
  24. struct fact
  25. {
  26.     int len;
  27.     vector<int> pp;
  28. }f[1000003];
  29.  
  30. bool operator<(fact &x,fact &y)
  31. {
  32.     if(x.len!=y.len)
  33.         return x.len<y.len;
  34.     int i;
  35.     for(i=0;i<x.len;i++)
  36.         if(x.pp[i]!=y.pp[i])
  37.             return x.pp[i]<y.pp[i];
  38.     return true;
  39. }
  40.  
  41. #define inf 2000000000
  42. #define maxs 1000002
  43.  
  44. vector<int> segment[4*maxs];
  45. int interv[105],cnt,n;
  46.  
  47. void mergesort(int node,int left,int right)
  48. {
  49.     segment[node].clear();
  50.     if(left==right)
  51.     {
  52.         segment[node].push_back(left);
  53.         return;
  54.     }
  55.  
  56.     int mid = (left+right)/2;
  57.     mergesort(2*node,left,mid);
  58.     mergesort(2*node+1,mid+1,right);
  59.  
  60.     segment[2*node].push_back(0);
  61.     segment[2*node+1].push_back(0);
  62.    
  63.     int i,j=0,k=0;
  64.     for(i=left;i<=right;i++)
  65.         if(f[ segment[2*node][j] ] < f [ segment[2*node+1][k] ])
  66.             segment[node].push_back(segment[2*node][j]),j++;
  67.         else
  68.             segment[node].push_back(segment[2*node+1][k]),k++;
  69.  
  70.     segment[2*node].pop_back();
  71.     segment[2*node+1].pop_back();
  72. }
  73.  
  74. void query(int node,int left,int right,int a,int b)
  75. {
  76.     if(b<left || a>right) return;
  77.     if(left>=a && right<=b)
  78.     {
  79.         interv[cnt++] = node;
  80.         return;
  81.     }
  82.  
  83.     int mid = (left+right)/2;
  84.     query(2*node,left,mid,a,b);
  85.     query(2*node+1,mid+1,right,a,b);
  86. }
  87.  
  88. bool comp(int x,int y)
  89. {
  90.     if(x==y)
  91.         return x<y;
  92.     return f[x]<f[y];
  93. }
  94.  
  95. int main()
  96. {
  97.     int t,a,b,k,i,j,cs=0;
  98.     n=1000000;
  99.     vector<int>::iterator it;
  100.    
  101.     int m = gene(n);
  102.     f[1].len = 1000;
  103.     f[0].len = 2000;
  104.     for(i=2;i<=n;i++)
  105.     {
  106.         f[i].pp.clear();
  107.         if(!p[i])
  108.         {
  109.             f[i].len = 1;
  110.             f[i].pp.push_back(i);
  111.             continue;
  112.         }
  113.         int temp = i;
  114.         for(j=0;j<m && pr[j]*pr[j]<=temp;j++)
  115.             while(temp%pr[j]==0)
  116.                 f[i].pp.push_back(pr[j]),temp/=pr[j];
  117.         if(temp!=1)
  118.             f[i].pp.push_back(temp);
  119.         f[i].len = f[i].pp.size();
  120.     }
  121.  
  122.     mergesort(1,1,n);
  123.  
  124.     scanf("%d",&t);
  125.     while(t--)
  126.     {
  127.         scanf("%d%d%d",&a,&b,&k);
  128.  
  129.         cnt = 0;
  130.         query(1,1,n,a,b);
  131.  
  132.         int lo=0,hi=segment[1].size()-1,mid,ans;
  133.         while(lo<=hi)
  134.         {
  135.             mid = (lo+hi)/2;
  136.  
  137.             int sum = 0;
  138.             for(i=0;i<cnt;i++)
  139.             {
  140.                 it = upper_bound(segment[interv[i]].begin(),segment[interv[i]].end(),segment[1][mid],comp);
  141.                 sum += (it - segment[interv[i]].begin());
  142.             }
  143.            
  144.             if(sum>=k)
  145.                 hi=mid-1,ans=mid;
  146.             else
  147.                 lo=mid+1;
  148.         }
  149.        
  150.         ans = segment[1][ans];
  151.         printf("Case %d:",++cs);
  152.         for(i=0;i<f[ans].len;i++)
  153.             printf(" %d",f[ans].pp[i]);
  154.         printf("\n");
  155.     }
  156.     return 0;
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement