又是什么都不会系列\(QAQ\),数组
连接ide
这就是一道模拟题。题目背景如题面所述。idea
开始的时候脑子木掉了,想了十几分钟spa
而后发现十分简单。个人思路以下code
\(a[i][j]\)表示第\(i\)我的第\(j\)天作的第\(k\)套题get
\(b[i][j]\)表示第\(i\)天的第\(j\)套题是否有人作,有就是1,没有就是0class
\(ans[i]\)表示第\(i\)天要作几套题。复杂度\(O(nm+nk)\);方法
\(ans[i]+=b[i][j]\)便可im
//比赛时 时空 19ms,4.87MB int n,m,k; int a[maxn][maxn],ans[maxn]; bool b[maxn][maxn]; int main(){ n=read(); m=read(); k=read(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ int x=read(); a[i][x]=j; } } for(int i=1;i<=n;i++){ for(int j=1;j<=k;j++){ b[j][a[i][j]]=1; } } for(int i=1;i<=k;i++) for(int j=1;j<=m;j++){ ans[i]+=b[i][j]; } for(int i=1;i<=k;i++) printf("%d ",ans[i]); return 0; }
连接img
构造题。
思路很简单:
当\(s[i]=K\)时,\(x[i]=y[i]=0\),
当\(s[i]=X\)时,\(x[i]=1,y[i]=0\)。
当\(s[i]=Y\)时,\(x[i]=0,y[i]=1\)
如何判断无解?
很简单,好比对于XYXZZZZ
,有解;对于ZYXZ
,无解
由于ZXYZ
的话,根据个人构造方法,x=0100;y=0010,
可是与ZXYZ
相矛盾;因此无解。
那就是说若是当前位为Z
,那么这一位日后的字符都得是Z
。
(我讲的不是很清楚,不懂的同窗请本身手写
因而,就有了一种判断方法
//倒序枚举,第i位是Z时 for(int j=1;j<i;j++) if(s[i]!='Z') return puts("-1"),0;
显然超时。
因而咱们能够开一个flag
,记录当前位是不是Z
,是则为1,不是则为0;
每次扫到Z
时判断下便可,具体见代码
char s[maxn],x[maxn],y[maxn]; bool flag=1; int main(){ scanf("%s",s+1); int len=strlen(s+1); for(int i=len;i;i--){ if(s[i]=='Z'){ if(!flag) return printf("-1"),0; x[i]=y[i]='0'; } if(s[i]=='X'){ flag=0; x[i]='1'; y[i]='0'; } if(s[i]=='Y'){ flag=0; x[i]='0'; y[i]='1'; } } printf("%s",x+1); puts(""); printf("%s",y+1); return 0; }
考场上只会\(\inf\)的作法,,因而只有\(3\ pts\);
结束的时候想出了正解(雾?解题过程以下
解法一
观察式子:\(y^2-x^2=ax+b\)
因而我想出消掉\(y\)。设\(y=x+k,k \ge 0\),显然有\(y \ge x\)
代入,化简得:\(2kx+k^2=ax+b\)
变为关于\(x\)的式子,为\((2k-a)x=b-k^2\)
当\(2k-a=0\ \And \And\ b-k^2=0\)时,\(0=0\).因此\(\forall x \in \mathbb N\),方程恒成立,即 当\(\displaystyle \frac{a}{2}=\sqrt b\)时,方程有无数组解
当\(\displaystyle \frac{a}{2} \not=b\)时,\(x=\displaystyle \frac{b-k^2}{2k-a},x \ge 0\)。将\(k\)看做主元,可得
当\(\displaystyle \frac{a}{2} \lt \sqrt{b}\)时,\(\displaystyle k \in (\frac{a}{2},\sqrt{b}\ \ ]\)
当\(\displaystyle \frac{a}{2} \gt \sqrt{b}\)时,\(\displaystyle k \in [\sqrt{b},\frac{a}{2})\)
而后能够根据范围枚举\(k\),由于\(y=x+k\),因此每获得一个\(x\),就会获得一组解。而后,注意精度形成的影响,就没了。
解法二
同窗想到的。
就是先把已知式子配方,即\(\displaystyle y^2-(x+\frac{a}{2})^2=\frac{4b-a^2}{4}\)
化简得\(\displaystyle (2y+2x+a)(2y-2x-a)=4b-a^2\)
而后判断\(4b-a^2\)的正负,若\(4b-a^2=0\),则输出\(\inf\)
枚举\(4b-a^2\)的因子,再求解相应的\(x,y\),符合要求则\(ans++\)
而后,又没了
复杂度大概都在\(O(\displaystyle \min(\frac{a}{2},\sqrt{b}))\)。。。。吧。。
\(Code1\)
int ans; signed main(){ int a=read(),b=read(); int sq=sqrt(b),q=a/2; if(sq*sq==b&&sq*2==a) printf("inf"); else if(a==1&&b==0) printf("1"); else if(sq>=q){ for(int i=q+1;i<=sq;i++) if((abs(b-i*i))%(abs(2*i-a))==0) ans++; printf("%lld",ans); } else{ int ed=(q*2==a)?(q-1):(q); for(int i=sq;i<=ed;i++) if((abs(b-i*i))%(abs(2*i-a))==0) ans++; printf("%lld",ans); } return 0; }
\(Code2\)
//同窗的代码,压了压行,请见谅 const int sea=1e5+7; int a,b,ans=0; bool check(int A,int B){ if((A+B)%2!=0||(B-A)%2!=0) return 0; int x,y;y=(A+B)/2;x=(B-A)/2; if(x<0||y<0) return 0; else return 1; } bool check1(int A,int B){ if((A+B)%2!=0||(B-A)%2!=0) return 0; int x,y;x=(A+B)/2;y=(B-A)/2; if(x<0||y<0) return 0;else return 1; } signed main(){ a=read(); b=read(); int xx=4*b-a*a; if(!xx) {puts("inf");return 0;} if(xx>=0){ for(int i=1;i<=sqrt(xx);i++){ if(xx%i==0){ if((i+a)%2!=0||(xx/i-a)%2!=0) continue; int A=(i+a)/2,B=(xx/i-a)/2; if(check(A,B)) ans++; } } } else{ xx=-xx; for(int i=1;i<=sqrt(xx);i++){ if(xx%i==0){ if((i-a)%2!=0||(xx/i-a)%2!=0) continue; int A=(i-a)/2,B=(xx/i-a)/2; if(check1(A,B)) ans++; } } } printf("%lld\n",ans); return 0; }
余下两题不会/写,仍是我太菜
回来再补上
\[ The \quad End \]
\[ \text{只要有心就能看见.从白云看到,不变蓝天;从风雨寻回,梦的起点.-《梦想天空分外蓝》陈奕迅} \]