纪中游记(十一)
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 }
终
遗憾错过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 }
终
定理还是要认真记