A

模拟即可。

#include <bits/stdc++.h>
using namespace std;
void solve(){
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);
	int cnt=0;string s;cin>>s;
	for(char c:s){
		cnt+=c-'0';
	}
	cout<<cnt%9<<'\n';
	return 0;
}

B

根据复数的定义直接模拟即可。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
struct cp{
	int x,y;
	cp(int xx=0,int yy=0){x=xx,y=yy;}
	cp operator*(cp const &b){
		return cp((x*b.x%mod-y*b.y%mod+mod)%mod,(x*b.y%mod+y*b.x%mod)%mod);
	}
};
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);
	int n;cin>>n;cp ans(1,0);
	while(n--){
		int x,y;cin>>x>>y;
		x=(x+mod)%mod;y=(y+mod)%mod;
		cp xx(x,y);ans=ans*xx;
	}
	cout<<ans.x<<" "<<ans.y<<'\n';
	return 0;
}

C

注意到 。令 表示 质因数分解后 的指数,则答案为

#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);
	vector<int>cnt(1000,0);
	int n;cin>>n;
	while(n--){
		int x;cin>>x;
		while(x%2==0){
			cnt[2]++;x/=2;
		}
		while(x%3==0){
			cnt[3]++;x/=3;
		}
		while(x%5==0){
			cnt[5]++;x/=5;
		}
	}
	cout<<min(min(cnt[2],cnt[3]),cnt[5])<<'\n';
	return 0;
}

D

注意到在十进制下能够影响 的只有数的最后一位,于是你枚举排列的最后一个数即可。答案为

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1000000007;
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);
	int n;cin>>n;
	vector<int>fac(n+1);fac[0]=1;
	for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
	int ans=0;
	for(int i=1;i<=n;i++){
		ans+=fac[n-1]*(i%5)%mod;
		ans%=mod;
	}
	cout<<ans<<'\n';
	return 0;
}

E

表示考虑 的前 个数,取出其中 个数,这些数的和为 的方案数,显然有转移 。类似地,我们还可以求出 表示考虑 的前 个数,取出其中 个数,这些数的和为 的方案数。则对答案数组 显然有转移 。滚动数组后对第二个 前缀和优化即可。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=400;
const int mod=1e9+7;
const int M=495;
int n,a[N],b[N],f[N][M+10],g[N][M+10],ans[M+10];
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];a[i]=a[i]%M;
	}
	for(int i=1;i<=n;i++){
		cin>>b[i];b[i]=b[i]%M;
	}
	f[0][0]=1;
	for(int k=1;k<=n;k++){
		int x=a[k];
		for(int i=n;i>=1;i--){
			for(int j=0;j<M;j++){
				f[i][j]+=f[i-1][(j-x+M)%M];
				f[i][j]%=mod;
			}
		}
	}
	g[0][0]=1;
	for(int k=1;k<=n;k++){
		int x=b[k];
		for(int i=n;i>=1;i--){
			for(int j=0;j<M;j++){
				g[i][j]+=g[i-1][(j-x+M)%M];
				g[i][j]%=mod;
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<M;j++){
			g[i][j]+=g[i-1][j];
			g[i][j]%=mod;
		}
	}
	for(int i=0;i<=n;i++){
		for(int j=0;j<M;j++){
			for(int k=0;k<M;k++){
				ans[(j+k)%M]+=f[i][j]*g[i][k]%mod;
				ans[(j+k)%M]%=mod;
			}
		}
	}
	for(int i=0;i<M;i++){
		cout<<ans[i]<<" ";
	}
	cout<<'\n';
	return 0;
}

F

注意到 。我们令 表示数 质因数分解下 上的指数,同时定义一个数 所对应的三元组为 。显然,如果要被 整除,这个三元组的每一位都分别不能小于

首先为了方便处理,我们令每一个数所对应的三元组 变为 。这样子的话我们一共有十二种状态。我们直接开十二颗树状数组分别维护每一个区间内对应状态的数量。然后你直接大力分类讨论两下子看看那些状态乘起来是合法的就行了。时间复杂度 ,但可能自带一个 左右的常数。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int cal(int n){
	int a=0,b=0,c=0;
	while(n%3==0){
		a++;n/=3;
	}
	while(n%5==0){
		b++;n/=5;
	}
	while(n%11==0){
		c++;n/=11;
	}
	a=min(a,2ll);b=min(b,1ll);c=min(c,1ll);
	if(a==0&&b==0&&c==0) return 1;
	if(a==0&&b==0&&c==1) return 2;
	if(a==0&&b==1&&c==0) return 3;
	if(a==0&&b==1&&c==1) return 4;
	if(a==1&&b==0&&c==0) return 5;
	if(a==1&&b==0&&c==1) return 6;
	if(a==1&&b==1&&c==0) return 7;
	if(a==1&&b==1&&c==1) return 8;
	if(a==2&&b==0&&c==0) return 9;
	if(a==2&&b==0&&c==1) return 10;
	if(a==2&&b==1&&c==0) return 11;
	if(a==2&&b==1&&c==1) return 12;
    return 0;
}
struct fenwick{
	vector<int>c;int n;
	void build(int _n){
		n=_n;c.resize(n+1);
	}
	int lowbit(int x){
		return x&-x;
	}
	void add(int pos,int x){
		for(int i=pos;i<=n;i+=lowbit(i)){
			c[i]+=x;
		}
	}
	int query_pre(int pos){
		int ans=0;
		for(int i=pos;i;i-=lowbit(i)){
			ans+=c[i];
		}
		return ans;
	}
	int query(int l,int r){
		return query_pre(r)-query_pre(l-1);
	}
	int Q(int l,int r){
		return query_pre(r)-query_pre(l-1);
	}
}ds[20];
int a[N];
int d(int x){
	return x*(x-1)/2;
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);
	int n,q;cin>>n>>q;
	for(int i=1;i<=12;i++){
		ds[i].build(n);
	}
	for(int i=1;i<=n;i++){
		cin>>a[i];a[i]=cal(a[i]);
		ds[a[i]].add(i,1);
	}
	while(q--){
		int opt;cin>>opt;
		if(opt==1){
			int x,y;cin>>x>>y;
			y=cal(y);
			ds[a[x]].add(x,-1);
			a[x]=y;
			ds[a[x]].add(x,1);
		}
		else{
			int l,r;cin>>l>>r;
			int ans=0;
			ans+=ds[7].query(l,r)*ds[6].query(l,r);
			for(int i=5;i<=7;i++){
				ans+=ds[8].query(l,r)*ds[i].query(l,r);
			}
			ans+=ds[9].query(l,r)*ds[4].query(l,r);
			ans+=ds[9].Q(l,r)*ds[8].Q(l,r);
			ans+=ds[10].Q(l,r)*ds[3].Q(l,r);
			ans+=ds[10].Q(l,r)*ds[4].Q(l,r);
			ans+=ds[10].Q(l,r)*ds[7].Q(l,r);
			ans+=ds[10].Q(l,r)*ds[8].Q(l,r);
			ans+=ds[11].Q(l,r)*ds[2].Q(l,r);
			ans+=ds[11].Q(l,r)*ds[4].Q(l,r);
			ans+=ds[11].Q(l,r)*ds[6].Q(l,r);
			ans+=ds[11].Q(l,r)*ds[8].Q(l,r);
			ans+=ds[11].Q(l,r)*ds[10].Q(l,r);
			for(int i=1;i<=11;i++){
				ans+=ds[12].Q(l,r)*ds[i].Q(l,r);
			}
			ans+=d(ds[8].Q(l,r));
			ans+=d(ds[12].Q(l,r));
			cout<<ans<<'\n';
		}
	}
	return 0;
}