这场比赛跟个zz一样 div1卡在了同余方程上 心态崩了去做div2 然后被T1搞崩了
T1:
大模拟
比较像配平方程式
思路:
但是未知物质每种元素系数不能≥10 且不能为空 (如CO2+?=CO2)
没考虑以上两种情况调了好久也没对 心态爆炸
loj 6255
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstdlib> 5 #include<cstring> 6 #include<algorithm> 7 #include<vector> 8 #include<queue> 9 #define inf 2139062143 10 #define ll long long 11 #define MAXN 700 12 using namespace std; 13 inline int read() 14 { 15 int x=0,f=1;char ch=getchar(); 16 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 17 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 18 return x*f; 19 } 20 int n,m,len,i,hsh[2][30]; 21 bool f,k; 22 char str[MAXN]; 23 int main() 24 { 25 n=read(),m=read(); 26 while(n--) 27 { 28 k=0; 29 memset(hsh,0,sizeof(hsh)); 30 scanf("%s",str+1); 31 len=strlen(str+1); 32 for(i=1;i<=len;i++) 33 { 34 if(str[i]=='=') break; 35 if('A'<=str[i]&&str[i]<='Z') 36 { 37 if(isdigit(str[i+1])) hsh[0][str[i]-'A']+=(str[i+1]-'0'); 38 else hsh[0][str[i]-'A']++; 39 } 40 else {if(str[i]=='?') f=0;continue;} 41 } 42 i++; 43 //cout<<i<<" "<<len; 44 for(i;i<=len;i++) 45 { 46 //cout<<i<<endl; 47 if('A'<=str[i]&&str[i]<='Z') 48 { 49 //cout<<i<<endl; 50 if(isdigit(str[i+1])) hsh[1][str[i]-'A']+=(str[i+1]-'0'); 51 else hsh[1][str[i]-'A']++; 52 } 53 else {if(str[i]=='?') f=1;continue;} 54 } 55 for(int i=0;i<26;i++) {if(hsh[f][i]>hsh[f^1][i]||hsh[f^1][i]-hsh[f][i]>9) {puts("No Solution");goto ed;}} 56 for(int i=0;i<26;i++) 57 { 58 if(hsh[f^1][i]-hsh[f][i]==1) {printf("%c",i+'A');k=1;} 59 else if(hsh[f^1][i]-hsh[f][i]) {printf("%c%d",i+'A',hsh[f^1][i]-hsh[f][i]);k=1;} 60 } 61 if(!k) printf("No Solution"); 62 printf(" "); 63 ed:; 64 } 65 }
T2:
考试的时候根本没看orz
这个问题是这样的:
对于任何一个n阶方阵,若任意从其中选择n个不同行不同列的位置,其上的权值之和均相等,则我们称这个矩阵是巧妙的。注意对于n=1的任何矩阵都是巧妙的
例如矩阵egin{matrix}1&2&3\4&5&6\7&8&9end{matrix}是巧妙的,因为1+5+9=1+6+8=2+4+9=2+6+7=3+5+7=3+4+8=15
而矩阵egin{matrix}1&2\2&1end{matrix}不巧妙,因为1+1≠2+2
现在有一个n×m大小的矩阵M以及T个询问,每次询问其一个子方阵是否是巧妙的
思路:
通过一些例子发现
只有一个矩阵内所有二阶矩阵都为巧妙矩阵是,该矩阵为巧妙矩阵
然后一个二维前缀和就行了
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstdlib> 5 #include<cstring> 6 #include<algorithm> 7 #include<vector> 8 #include<queue> 9 #define inf 2139062143 10 #define ll long long 11 #define MAXN 510 12 using namespace std; 13 inline int read() 14 { 15 int x=0,f=1;char ch=getchar(); 16 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 17 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 18 return x*f; 19 } 20 int n,m,mp[MAXN][MAXN],Q; 21 int s[MAXN][MAXN]; 22 int main() 23 { 24 n=read(),m=read();int a,b,c; 25 Q=read(); 26 for(int i=1;i<=n;i++) 27 for(int j=1;j<=m;j++) 28 mp[i][j]=read(); 29 for(int i=2;i<=n;i++) 30 for(int j=2;j<=m;j++) 31 s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+(mp[i][j]+mp[i-1][j-1]==mp[i][j-1]+mp[i-1][j]); 32 while(Q--) 33 { 34 a=read(),b=read(),c=read(); 35 printf("%c ",s[a+c-1][b+c-1]-s[a+c-1][b]-s[a][b+c-1]+s[a][b]==(c-1)*(c-1)?'Y':'N'); 36 } 37 }
T3:
若一个数列a满足条件a[n]=a[n-1]+a[n-2],n >=3,而a1 a2 为任意实数,则我们称这个数列为广义斐波那契数列
现在请你求出满足条件a1=i,a2为区间[l,r]中的整数,且ak mod p=m 的广义斐波那契数列有多少个
思路:
可以通过fibonacci+矩阵加速求出ak
然后将问题转化为一个同余方程 使用exgcd解决
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstdlib> 5 #include<cstring> 6 #include<algorithm> 7 #include<vector> 8 #include<queue> 9 #define inf 2139062143 10 #define ll long long 11 #define MAXN 510 12 using namespace std; 13 inline ll read() 14 { 15 ll x=0,f=1;char ch=getchar(); 16 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 17 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 18 return x*f; 19 } 20 ll MOD; 21 struct mat {ll num[2][2];}; 22 mat mul(mat x,mat y) 23 { 24 mat res; 25 memset(res.num,0,sizeof(res.num)); 26 for(ll i=0;i<2;i++) 27 for(ll j=0;j<2;j++) 28 for(ll k=0;k<2;k++) 29 (res.num[i][j]+=x.num[i][k]*y.num[k][j]%MOD)%=MOD; 30 return res; 31 } 32 ll q_pow(ll n) 33 { 34 if(n<=0) return 0; 35 mat t,res; 36 memset(res.num,0,sizeof(res.num)); 37 t.num[0][0]=t.num[0][1]=t.num[1][0]=1,t.num[1][1]=0; 38 res.num[0][0]=res.num[1][1]=1; 39 while(n) 40 { 41 if(n&1) res=mul(res,t); 42 t=mul(t,t); 43 n>>=1; 44 } 45 return res.num[0][1]; 46 } 47 ll exgcd(ll a,ll b,ll &x,ll &y) 48 { 49 if(b==0) {x=1;y=0;return a;} 50 ll d=exgcd(b,a%b,y,x); 51 y-=a/b*x; 52 return d; 53 } 54 ll solve(ll a,ll b) 55 { 56 ll x,y; 57 ll gcd=exgcd(a,MOD,x,y); 58 if(b%gcd) return -1; 59 x*=b/gcd,MOD/=gcd; 60 if(MOD<0) MOD=-MOD; 61 ll res=x%MOD; 62 if(res<=0) res+=MOD; 63 return res; 64 } 65 int main() 66 { 67 ll T,a,b,l,r,m,res,ans,n; 68 T=read(); 69 while(T--) 70 { 71 a=read(),l=read(),r=read(),n=read(),MOD=read(),m=read(),a%=MOD; 72 (a*=q_pow(n-2))%=MOD,b=q_pow(n-1); 73 m=(m-a+MOD)%MOD; 74 res=solve(b,m); 75 if(res==-1) {puts("0");continue;} 76 if(r<res) {puts("0");continue;} 77 ans=(r-res)/MOD+1; 78 if(l>res) {ans-=(l-res)/MOD+1;if((l-res)%MOD==0) ans++;} 79 printf("%lld ",ans); 80 } 81 }