首页 > 其他 > 详细

2019银联高校极客挑战赛 复赛

时间:2019-08-10 22:39:51      阅读:206      评论:0      收藏:0      [点我收藏+]

 

一直不在状态……

想着各种事情……

 

B.

对于a,是x的倍数,且不是y的倍数(其中p%x==0,y%x==0,p%y==0)

则对于b,是(p/x)的倍数

 

应该还有更快的方法

 

  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <cmath>
  4 #include <cstring>
  5 #include <string>
  6 #include <algorithm>
  7 #include <iostream>
  8 using namespace std;
  9 #define ll long long
 10 
 11 const double eps=1e-8;
 12 const ll inf=1e9;
 13 const ll mod=1e9+7;
 14 const int maxn=1e5+10;
 15 
 16 ///2,3,5,7,11,13
 17 
 18 struct node
 19 {
 20     ll g;
 21     ///large to small
 22     ll a[10],b[10];
 23 }f[maxn];
 24 
 25 ll zhi[maxn],zhi_cnt,maxv=1e5;
 26 ll x[300],gx[300],y[130][maxn];
 27 bool vis[maxn],use[maxn];
 28 ll p;
 29 
 30 ///10^5*64
 31 void dfs(ll i,ll j,ll k)
 32 {
 33     if (k==f[p].g+1)
 34     {
 35         ll l,z;
 36         y[j][0]=0;
 37         x[j]=i;
 38         z=f[p].g;
 39         for (l=1;l<=i;l++)
 40         {
 41             for (k=1;k<=z;k++)
 42                 if (l%zhi[f[p].a[k]]==0 && use[k])
 43                     break;
 44             if (k==z+1)
 45                 y[j][l]=y[j][l-1]+1;
 46             else
 47                 y[j][l]=y[j][l-1];
 48         }
 49         gx[j]=y[j][i];
 50         return;
 51     }
 52     use[k]=0;
 53     dfs(i,j*2,k+1);
 54     use[k]=1;
 55     dfs(i*zhi[f[p].a[k]],j*2+1,k+1);
 56 }
 57 
 58 ll work(ll u,ll v)
 59 {
 60     ll r=0,i,j;
 61     v/=u;
 62 
 63     i=1,j=1;
 64     while (i<=f[u].g && j<=f[p].g)
 65     {
 66         if (f[u].a[i]==f[p].a[j])
 67         {
 68             if (f[u].b[i]==f[p].b[j])
 69                 r=r*2;
 70             else
 71                 r=r*2+1;
 72             i++;
 73             j++;
 74         }
 75         else if (f[u].a[i]>f[p].a[j])
 76             i++;
 77         else
 78         {
 79             j++;
 80             r=r*2+1;
 81         }
 82     }
 83     while (j<=f[p].g)
 84         r=r*2+1,j++;
 85 
 86     return v/x[r]*gx[r]+y[r][v%x[r]];
 87 }
 88 
 89 int main()
 90 {
 91     ll t,i,j,k,maxv=1e5;
 92     ll n,m,sum;
 93     for (i=2;i<=maxv;i++)
 94     {
 95         if (!vis[i])
 96         {
 97             zhi[++zhi_cnt]=i;
 98             f[i].g=1;
 99             f[i].a[1]=zhi_cnt;
100             f[i].b[1]=1;
101         }
102         for (j=1;j<=zhi_cnt;j++)
103         {
104             k=i*zhi[j];
105             if (k>maxv)
106                 break;
107             vis[k]=1;
108             f[k]=f[i];
109             if (f[i].a[f[i].g]==j)
110                 f[k].b[f[k].g]++;
111             else
112             {
113                 f[k].g++;
114                 f[k].a[f[k].g]=j;
115                 f[k].b[f[k].g]=1;
116             }
117             if (i%zhi[j]==0)
118                 break;
119         }
120     }
121 
122     scanf("%lld",&t);
123     while (t--)
124     {
125         scanf("%lld%lld%lld",&n,&m,&p);
126 //        if (p==1)
127 //        {
128 //            printf("%lld\n",n*m);
129 //            continue;
130 //        }
131         dfs(1,0,1);
132 
133         sum=0;
134         for (i=1;i<=p;i++)
135             if (p%i==0)
136             {
137                 j=p/i;
138 
139                 sum+=work(i,n)*(m/j);
140             }
141         printf("%lld\n",sum);
142     }
143     return 0;
144 }
145 /*
146 5
147 1000000000 1000000000 1
148 1000000000 1000000000 2
149 1000000000 1000000000 10
150 100000000 100000000 2
151 10 20 15
152 1000000000 1000000000 30030
153 100000000 100000000 30030
154 
155 1
156 9 9 9
157 1
158 6 6 12
159 
160 1
161 20 20 11
162 
163 1
164 10 10 6
165 */

 

场上感觉,然后看了题解,以下想法基本是错的……

C.

a1,b1,c1

a2,b2,c2

要求

a1<b2<c1

a2<b1<c2

有可能要按照某种方式排序

可能与cdq分治有关,但也许想法是错的。

 

题解:取反求,然后就是偏序的子问题。

 

 

D.

一开始以为是图,觉得不可做,

后面发现是树。。。

 

很明显的点分治

不能记录值为xi的个数yi,因为mod 998244353998244353,

只能子集合求数值和->总数值和

补充:

点分治,记录到达根的数值情况

情况无法量化,

ai*bj (1<=i<=?,1<=j<=?)

所以无法用点分治!!!

 

处理^k(k<=13)

各种多项式操作。 (题解:二项式操作)

 

题解:树形DP。某个点为根的子树:子树内解决/子树为根继续往上。

 

 

 

E.

末尾有0的操作。

 

只可能为

a->b->c->b->c

b->c->b->c

 

处理每个区间的最小/最大值

 

每次a->b时进行修改,

提前记录,也许要额外建一棵树,

数目不多。

 

题解的最后一部分没看懂。。。

 

F.

跟E一样,怎么都是各种修改。

没想法,估计较难。

 

2019银联高校极客挑战赛 复赛

原文:https://www.cnblogs.com/cmyg/p/11333010.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!