题目传送门

A 位数问题

B 先先的生日

C 小静的考验

D 超级感染

E 超级GCD

T1位数问题

错的原因

暴力写的,以后不能这么局限,要多思考

思路

这里可以发现x位的单数个与双数个来源于n-1的单数个与双数,单数个可以由n-1的双数扩充九倍+ n-1的单数,双数个可以由n-1的单数扩充九倍+ n-1的双数,但第一位不能为0,所以输出要减一下n-1双数个数

代码

#include<bits/stdc++.h>
using namespace std;
int n,m=12345,a[10000][10];
int main(){
	freopen("bit.in","r",stdin);
	freopen("bit.out","w",stdout);
	cin>>n;
	a[1][0]=9,a[1][1]=1;
	if(n==1){cout<<9;return 0;}
	for(int i=2;i<=n;i++){
		a[i][0]=((a[i-1][0]*9)%m+a[i-1][1])%m;
		a[i][1]=(a[i-1][0]+(a[i-1][1]*9)%m)%m;
	}
	cout<<(a[n][0]-a[n-1][0]+m)%m;
	return 0;	
}

T2先先的生日

错的点

在找因数是没优化,以后不能这样子不优化就交

思路

这道题是一道找约数的题,我们每次输入后让这个数加入哈希表,然后我们扫一遍数组中aia_i的约数(要用i<sqrt()优化)如果是n自己的话要减一,最后输出

代码

#include<bits/stdc++.h>
using namespace std;
unordered_map<int ,int>ma;
int n,a[100010];
int main(){
	freopen("birth.in","r",stdin);
	freopen("birth.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		ma[a[i]]++;
	}
	for(int i=1;i<=n;i++){
		int j=a[i],s=0;
		for(int h=1;h<=sqrt(j);h++){
			if(j%h==0){
				int x=h,y=j/h;
				if(x==j&&y==j)s+=ma[y],s--;
				else if(x==y)s+=ma[x];
				else{
					if(y==j)s--;
					s+=ma[x];
					s+=ma[y];
				}
			}			
		}
		cout<<s<<"\n";
	}
	return 0;	
}

小静的考验

错的点

根本没做,以后不能空题,要发挥思维

思路

这里我们输入后先逆序循环(n-1)~1如果ai>(ai1)a_i>(a_i-1)那么就开始操作,需要乘法的定律,如下

if(a[i]>a[i+1]){
	long long k=ceil(a[i]*1.0/a[i+1]);
	a[i]=a[i]*1.0/k;
	c+=k-1;
}

代码

#include<bits/stdc++.h>
using namespace std;
long long n,a[2000010],st[2000010],c;
int main(){
	freopen("xiaojing.in","r",stdin);
	freopen("xiaojing.out","w",stdout);
	long long t;
	cin>>t;
	while(t--){
		cin>>n;
		c=0;
		for(long long i=1;i<=n;i++)cin>>a[i];
		for(long long i=n-1;i>=1;i--){
			if(a[i]>a[i+1]){
				long long k=ceil(a[i]*1.0/a[i+1]);
				a[i]=a[i]*1.0/k;
				c+=k-1;
			}	
		}
		cout<<c<<"\n";
	}
	return 0;	
}

超级感染

错的点

公式推错了,以后要多打草稿

思路

这道题是一道排列组合的题,公式还算好推,但在取余是要加取余数,防止出现负数情况,快速幂也要写,其他的没了

代码

#include<bits/stdc++.h>
using namespace std;
long long q(long long b,long long e,long long m){
	long long r=1;
	while(e){
		if(e&1)r=r*b%m;
		b=b*b%m;
		e>>=1;
	}
	return r;
}
int main(){
	freopen("super.in","r",stdin);
	freopen("super.out","w",stdout);
	long long mo=100003;
	long long m,n;
	cin>>m>>n;
	if(n==1){cout<<0;return 0;}
	cout<<(((q(m,n,mo)+mo)%mo-((m*q(m-1,n-1,mo))+mo)%mo)+mo)%mo;
}