T1[A. 矩阵游戏]
40%算法
首先注意几个性质:先乘后乘,或有没有0都一样,
记录下每一行,每一列乘的累计值$a_i b_j$
最后$ans=cal(i,j)*a_i*b_j$ 其中cal为O(1)计算初始每个位置的值$O(nm)$枚举
100%算法
只需要把式子展开,然后就能分别O(n)O(m)计算
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #define R register 6 #define int long long 7 using namespace std; 8 int read() 9 { 10 int f=1,x=0;char ch=getchar(); 11 while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();} 12 while(ch<=‘9‘&&ch>=‘0‘){x=(x<<3)+(x<<1)+ch-‘0‘;ch=getchar();} 13 return f*x; 14 } 15 const int maxn=1000005; 16 const int mod=1e9+7; 17 int n,m,k; 18 int a[maxn],b[maxn]; 19 int fa[maxn],fb[maxn]; 20 char opt[3]; 21 int cal(int x,int y) 22 { 23 return ((x-1)*m%mod+y)%mod; 24 } 25 signed main() 26 { 27 // freopen("data","r",stdin); 28 n=read(),m=read(),k=read(); 29 for(int i=1;i<=n;i++) 30 fa[i]=1; 31 for(int i=1;i<=m;i++) 32 fb[i]=1; 33 while(k--) 34 { 35 scanf("%s",opt); 36 R int x=read(),y=read(); 37 if(opt[0]==‘R‘) 38 { 39 fa[x]=fa[x]*y%mod; 40 } 41 else 42 { 43 fb[x]=fb[x]*y%mod; 44 } 45 } 46 int sum=0,dtb=0,ta=0; 47 for(int i=1;i<=n;i++){ 48 ta=(ta+(i-1)*m%mod*fa[i]%mod)%mod; 49 dtb=(dtb+fa[i])%mod; 50 } 51 for(int j=1;j<=m;j++) 52 (sum+=fb[j]*ta%mod+j*fb[j]%mod*dtb%mod)%=mod;; 53 printf("%lld\n",sum%mod); 54 }
T2[B. 跳房子]「模拟」
原文:https://www.cnblogs.com/casun547/p/11312067.html