【ContestHunter】【弱省胡策】【Round5】

反演+FFT+构造+DP


 

 

  写了这么多tag,其实我一个也不会

A

  第一题是反演……数据范围10W,看着就有种要用FFT等神奇算法的感觉……然而蒟蒻并不会推公式,只好写了20+10分的暴力,然而特判30分的时候好像挂了,所以并没有拿到……20分滚粗了

  最近打暴力搞部分分的时候,写各种情况的判断条件什么的总是出问题……sad……以后还是自己造下数据判一下能不能过吧,不能总是靠人品啊>_>

 

  我还是放弃FFT吧,反正……出来这种题,我也想不到要用FFT & 不会推公式……呵呵哒

 1 //Round5 A
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<iostream>
 6 #include<algorithm>
 7 #define rep(i,n) for(int i=0;i<n;++i)
 8 #define F(i,j,n) for(int i=j;i<=n;++i)
 9 #define D(i,j,n) for(int i=j;i>=n;--i)
10 #define pb push_back
11 using namespace std;
12 typedef long long LL;
13 inline int getint(){
14     int r=1,v=0; char ch=getchar();
15     for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1;
16     for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch;
17     return r*v;
18 }
19 const int N=100010,P=998244353;
20 /*******************template********************/
21 
22 LL n,b[N],a[N];
23 LL fac[N],inv[N];
24 LL Pow(LL a,int b){
25     LL r=1;
26     for(;b;b>>=1,a=a*a%P) if (b&1) r=r*a%P;
27     return r;
28 }
29 
30 LL C(int n,int m){
31     return fac[n]*inv[m]%P*inv[n-m]%P;
32 }
33 int main(){
34 #ifndef ONLINE_JUDGE
35     freopen("A.in","r",stdin);
36     freopen("A.out","w",stdout);
37 #endif
38     n=getint();
39     if (n>1000){
40         F(i,0,n) printf("1 "); puts(""); return 0;
41     }
42     fac[0]=fac[1]=1; F(i,2,n) fac[i]=fac[i-1]*i%P;
43     inv[n]=Pow(fac[n],P-2); inv[0]=1;
44     D(i,n-1,1) inv[i]=inv[i+1]*(i+1)%P;
45 
46     F(i,0,n) b[i]=getint();
47     bool sign=1;
48     F(i,0,n) if (b[i]!=C(n+1,i+1)){sign=0; break;}
49     if (sign){F(i,0,n) printf("1 "); puts(""); return 0;}
50     D(i,n,0){
51         F(j,i+1,n) b[i]=((b[i]-C(j,i)*a[j]%P)+P)%P;
52         a[i]=b[i];
53     }
54     F(i,0,n) printf("%lld ",b[i]); puts("");
55     return 0;
56 }
View Code

B

  qmqmqm神犇出的构造题,随便yy一下就可以联想到邻接矩阵,然后k次方后,a[i][j]就是从 i 开始走k步能否走到j。

  然而我傻逼地没有特判k=1的情况

  事实是:我在想到正解之前看到k=1的点发现这应该直接输出全1矩阵,再小一点的数据可以暴力枚举初始矩阵,然而……后来就没再像这种边界情况,真是作死。95分滚粗了

 1 //Round5 B
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<iostream>
 6 #include<algorithm>
 7 #define rep(i,n) for(int i=0;i<n;++i)
 8 #define F(i,j,n) for(int i=j;i<=n;++i)
 9 #define D(i,j,n) for(int i=j;i>=n;--i)
10 #define pb push_back
11 using namespace std;
12 typedef long long LL;
13 inline int getint(){
14     int r=1,v=0; char ch=getchar();
15     for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1;
16     for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch;
17     return r*v;
18 }
19 const int N=310;
20 /*******************template********************/
21 
22 int n,k;
23 struct Matrix{
24     bool c[N][N];
25     bool* operator [] (int x){return c[x];}
26     Matrix(){memset(c,0,sizeof c);}
27     void print(){
28 //        F(i,1,n){F(j,1,n) printf("%d ",c[i][j]); puts("");}
29         F(i,1,n){
30             F(j,1,n) printf("%c",c[i][j]+'0');
31             puts("");
32         }
33         puts("");
34     }
35 }f;
36 
37 Matrix operator * (Matrix a,Matrix b){
38     Matrix c;
39     F(i,1,n) F(k,1,n) F(j,1,n)
40         c[i][j]+=a[i][k]*b[k][j];
41     return c;
42 }
43 Matrix Pow(Matrix a,int b){
44     Matrix c;
45     F(i,1,n) c[i][i]=1;
46     for(;b;b>>=1,a=a*a) if (b&1) c=c*a;
47     return c;
48 }
49 int main(){
50 #ifndef ONLINE_JUDGE
51     freopen("B.in","r",stdin);
52     freopen("B.out","w",stdout);
53 #endif
54     n=getint(); k=getint();
55     if (k==1){
56         F(i,1,n){F(j,1,n) printf("%c",'1'); puts("");}
57         return 0;
58     }
59     F(i,1,n) f[i][i]=1;
60 
61     F(i,1,k-1) f[i][i+1]=1;
62     f[k][1]=1;
63 
64     F(i,k+1,n) f[i][1]=f[1][i]=1;
65     F(i,1,n){
66         F(j,1,n) printf("%c",f[i][j]+'0');
67         puts("");
68     }
69 /*    F(i,0,k){
70         printf("No. %d\n",i);
71         Pow(f,i).print();
72     }*/
73     return 0;
74 }
View Code

C

  对我来说神一样的DP,然而并不能找到一种合理的状态表示方式,所以也就搞不出来了……快速幂10分滚粗

 1 //Round5 C
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<iostream>
 6 #include<algorithm>
 7 #define rep(i,n) for(int i=0;i<n;++i)
 8 #define F(i,j,n) for(int i=j;i<=n;++i)
 9 #define D(i,j,n) for(int i=j;i>=n;--i)
10 #define pb push_back
11 using namespace std;
12 typedef long long LL;
13 inline int getint(){
14     int r=1,v=0; char ch=getchar();
15     for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1;
16     for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch;
17     return r*v;
18 }
19 const int N=110,P=1e9+7;
20 /*******************template********************/
21 
22 int n,m,k;
23 LL f[N][N],fac[N],inv[N];
24 LL Pow(LL a,int b){
25     LL r=1;
26     for(;b;b>>=1,a=a*a%P) if (b&1) r=r*a%P;
27     return r;
28 }
29 LL C(int n,int m){return fac[n]*inv[m]*inv[n-m]%P;}
30 
31 int main(){
32 #ifndef ONLINE_JUDGE
33     freopen("C.in","r",stdin);
34     freopen("C.out","w",stdout);
35 #endif
36     n=getint(); m=getint(); k=getint();
37     fac[0]=fac[1]=1;
38     F(i,2,k) fac[i]=fac[i-1]*i%P;
39     inv[k]=Pow(fac[k],P-2); inv[0]=1;
40     D(i,k,2) inv[i-1]=inv[i]*i%P;
41 
42     if (n==1){printf("%lld\n",Pow(k,m)); return 0;}
43     else{
44     }
45     return 0;
46 }
View Code

 

  下午去考了信息会考,然后就回来改题……然而什么也不会,心情好糟糕,什么也不想做……整个人都不好了……

  o(︶︿︶)o 唉还有35?还是34?天就要NOI了……我还是这么傻逼,没救了,是不是退OI保平安比较好……

posted @ 2015-06-11 17:38  Tunix  阅读(680)  评论(1编辑  收藏  举报