纪中游记(十一)

20190817

T0

jio得是DP,就懒得想了(反正也做不出来)

what?贪心竟能水过一半分?更有甚者贪得满分?(心态大崩)(数据大水*1)

不过正解并不是贪心,而是暴力枚举所有状态(数据大水*2)

首先感谢MHY的讲解,我们来看题:(其实并没有题面可看)

不难发现一个做法就是前面说的枚举所有行(或者列)的状态,再用列填补漏下的部分,

这样就把所有情况都考虑进去,正解顺水推舟

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,t,r,ans=0x7fffffff;
 4 char a[20][20];
 5 bool hang[20],lie[20];
 6 void dfs(int x,int num);
 7 int main()
 8 {
 9     scanf("%d%d",&n,&m);
10     for(int i=1;i<=n;i++)
11     {
12         scanf("%s",a[i]+1);
13     }
14     scanf("%d%d",&r,&t);
15     dfs(1,0);
16     printf("%d",ans);
17     return 0;
18 }
19 void dfs(int x,int num)
20 {
21     if(x==n+1)
22     {
23         memset(lie,0,sizeof(lie));
24         for(int i=1;i<=n;i++)
25         {
26             for(int j=1;j<=m;j++)
27             {
28                 if(a[i][j]=='X'&&!hang[i])
29                     lie[j]=1;
30             }
31         }
32         for(int j=1;j<=m;j++)
33         {
34             if(lie[j])
35             {
36                 num++;
37                 for(int jj=j;jj<=j+t-1;jj++)
38                 {
39                     if(j>m) break;
40                     lie[jj]=0;
41                 }
42             }
43         }
44         ans=min(ans,num);
45         return;
46     }
47     if(!hang[x])
48     {
49         for(int i=x;i<=min(x+r-1,n);i++)
50         {
51             hang[i]=1;
52         }
53         dfs(x+1,num+1);
54         for(int i=x;i<=min(x+r-1,n);i++)
55         {
56             hang[i]=0;
57         }
58     }
59     dfs(x+1,num);
60 }
神奇CODE

遗憾错过50+

T1

阶乘?递推?……

奈何有个神奇的定理我没记住:

若正整数N被唯一分解为N=p1c1p2c2…pmcm,其中ci是正整数,pi是质数且满足p1<p2<…<pm,则N的正约数个数为:

(c1+1)×(c2+1)×…×(cm+1)=∏(i=1->m)(ci+1)

但光这个还不够,我们还需要找出(n!k)的所有质因子,由于(n!k)非常大,我们不能通过试除法来找出,只好从题面来找规律,

虽然(n!k)未知,但可以预处理求出(n!0),打一个表手玩一下,得出惊人的结论:

      (n!k)=(n-1!k)+(n!k-1)

有了这个,这道题就非常简单了,预处理出(n!0),再通过递推得出对于每个质因子在(n!k)时的数量,最后套入定理就可以AC

参考代码:

 1 #include<bits/stdc++.h>
 2 #define ull int
 3 using namespace std;
 4 ull su[205],f[1001][101][170];
 5 long long ans=1;
 6 int gs=0,k,n;
 7 void aish()
 8 {
 9     bool ui[1005];
10     for(int i=2;i<=1000;i++)
11     {
12         if(!ui[i])
13         {
14             su[++gs]=i;
15             //cout<<su[gs]<<" "<<gs<<endl;
16             for(int j=i;j<=1000/i;j++)
17             {
18                 ui[i*j]=1;
19             }
20         }
21     }
22 }
23 void zhyi()
24 {
25     for(int i=1;i<=n;i++)
26     {
27         int op=i,j=1;
28         while(op&&(j<=gs))
29         {
30             while((op%su[j]==0)&&op)
31             {
32                 op/=su[j];
33                 f[i][0][j]++;
34             }
35             j++;
36         }
37     }
38 }
39 int main()
40 {
41     scanf("%d%d",&n,&k);
42     aish();
43     zhyi();
44     //cout<<su[gs]<<" ";
45     for(int i=1;i<=n;i++)
46     {
47         for(int j=1;j<=k;j++)
48         {
49             for(int kk=1;kk<=168;kk++)
50             {
51                 f[i][j][kk]=(f[i-1][j][kk]+f[i][j-1][kk])%1000000009;
52             }
53         }
54     }
55     for(int i=1;i<=168;i++)
56     {
57         ans=(ans*(f[n][k][i]+1))%1000000009;
58     }
59     printf("%lld",ans);
60     return 0;
61 }
在这里

定理还是要认真记

posted @ 2019-08-17 20:28  HHHG  阅读(196)  评论(1编辑  收藏  举报