CodePlus 2017 12 月赛

这场比赛跟个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 }
View Code

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 }
View Code

T3:

若一个数列a满足条件a[n]=a[n-1]+a[n-2],n >=3,而a1 a2 为任意实数,则我们称这个数列为广义斐波那契数列

现在请你求出满足条件a1​​=i,a2​​为区间[l,r]中的整数,且amod 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 }
View Code
原文地址:https://www.cnblogs.com/yyc-jack-0920/p/8118450.html