【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 }
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 }
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 }
下午去考了信息会考,然后就回来改题……然而什么也不会,心情好糟糕,什么也不想做……整个人都不好了……
o(︶︿︶)o 唉还有35?还是34?天就要NOI了……我还是这么傻逼,没救了,是不是退OI保平安比较好……