B.小w的a=b问题
题意:给出两个序列 求这两个序列的所有数的阶乘积是否相等
我采用分解质因数的方法 非常的麻烦
题解:
先预处理 x!= f[x] 肯定要加一个模数 模数为一个大质数 为了避免偶然性 处理10个模数
#include<bits/stdc++.h> using namespace std; const int MAXN=100005; long long mod[10]={10000019,10000079,10000103,10000121,10000139,10000141,10000169,10000189,10000223,10000229}; long long fact[MAXN][10],hash1[10],hash2[10],a[MAXN],b[MAXN]; int T,n,m; int main() { for(int i=0;i<10;++i) { fact[0][i]=1; } for(long long i=1;i<=100000;++i) { for(int j=0;j<10;++j) { fact[i][j]=(fact[i-1][j]*i)%mod[j]; } } scanf("%d",&T); while(T--) { scanf("%d %d",&n,&m); for(int i=1;i<=n;++i) { scanf("%lld",&a[i]); } for(int i=1;i<=m;++i) { scanf("%lld",&b[i]); } for(int i=1;i<10;++i) { hash1[i]=hash2[i]=1; } for(int i=1;i<=n;++i) { for(int j=0;j<10;++j) { hash1[j]=(hash1[j]*fact[a[i]][j])%mod[j]; } } for(int i=1;i<=m;++i) { for(int j=0;j<10;++j) { hash2[j]=(hash2[j]*fact[b[i]][j])%mod[j]; } } bool flag=true; for(int j=0;j<10;++j) { if(hash1[j]!=hash2[j]) { flag=false; } } if(flag) { printf("equal "); } else { printf("unequal "); } } return 0; }
小w的糖果
一个序列n个数 一开始都为0 下面有三种操作
1. 将x位置及以后的数+1
2.将x位置及以后的数+当前位置是第几个加的
3.将x位置及以后的数+ 当前位置是第几个加的 的平方
用了线段树维护差分数组 又是脑残做法
题解:
维护差分数组
1 2 较简单
3 为三重差分 计算得 当前项与前一项相差 2k-1
#include<bits/stdc++.h> using namespace std; const int MAXN=100005; const long long mod=(long long)1e9+7; long long d1[MAXN],d2[MAXN],d3[MAXN];//1 id id2 int n,m,T,type,pos; void pre_sum(long long a[]) { for(int i=1;i<=n;++i) { a[i]=(a[i]+a[i-1])%mod; } return; } int main() { scanf("%d",&T); while(T--) { memset(d1,0,sizeof(d1)); memset(d2,0,sizeof(d2)); memset(d3,0,sizeof(d3)); scanf("%d %d",&n,&m); while(m--) { scanf("%d %d",&type,&pos); if(type==1) { d1[pos]++; } if(type==2) { d2[pos]++; } if(type==3) { d3[pos]++; d3[pos+1]++; } } pre_sum(d1); pre_sum(d2); pre_sum(d2); pre_sum(d3); pre_sum(d3); pre_sum(d3); for(int i=1;i<=n;++i) { printf("%lld%c",(d1[i]+d2[i]+d3[i])%mod,i==n?' ':' '); } } return 0; }