智算之道2020复赛题目

文章目录

    • 数字
    • 网络
    • 有向无环图
    • 分数
    • 树数数

数字

智算之道2020复赛题目_第1张图片

#include
using namespace std;
typedef long long ll;
ll a,b,aa,num;
int len,cnt;
int main(){
	scanf("%lld%lld",&aa,&b);
	num=aa;
	if(!aa) len++;
	else{
		while(num){
			len++;
			num/=10;
		}
	}
	for(int i=1;i<=9;i++)
	for(int j=0;j<=9;j++)
	for(int k=0;k<=9;k++){
		ll p=i*100+j*10+k;
		int len1=len;
		while(len1--) p*=10;
		p+=aa;
		if(p%b==0)  cnt++;
	}
	printf("%d\n",cnt);
}

智算之道2020复赛题目_第2张图片

网络

智算之道2020复赛题目_第3张图片
智算之道2020复赛题目_第4张图片

#include
using namespace std;
typedef long long ll;
const int maxn=2e3+10;
ll dp[maxn];
struct node{
	int x,y;
}a[maxn];
bool cmp(const node&a,const node&b){
	if(a.x!=b.x)
	return a.x<b.x;
	else a.y<b.y;
}
int main(){
	int n,k,w1,w2;
	scanf("%d%d%d%d",&n,&k,&w1,&w2);
	for(int i=1;i<=k;i++)
	scanf("%d%d",&a[i].x,&a[i].y);
	a[++k].x=n;a[k].y=n;
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=k;i++){
		dp[i]=1ll*(a[i].x+a[i].y)*w1;
	}
	for(int i=2;i<=n;i++)
	for(int j=1;j<i;j++){
		int num=a[i].x+a[i].y-a[j].x-a[j].y-2;
		dp[i]=min(dp[i],dp[j]+1ll*num*w1+w2);
	}
	printf("%lld\n",dp[k]);
}

有向无环图

智算之道2020复赛题目_第5张图片
智算之道2020复赛题目_第6张图片

二进制拆解

分数

智算之道2020复赛题目_第7张图片
智算之道2020复赛题目_第8张图片

规律:若是素数,得算,比如2,3.若是素数的倍数,也得算,比如4,9得分别得乘2,3.若不是素数,也不是素数的倍数,就跳过,如6.

#include
using namespace std;
typedef long long ll;
const ll mod=1LL<<32;
const int N=8e7;
int u[N+10];
int su[5000000],cnt;
int n;
ll a,b;
void oula(){
	for(int i=2;i<N;i++){
	if(!u[i])
			su[++cnt]=i;
		for(int j=1;j<=cnt&&i*su[j]<N;j++){
			u[i*su[j]]=1;
			if(i%su[j]==0)break;
	    }		
	}
}
int main()
{
	oula();
	scanf("%d%lld%lld",&n,&a,&b);
	for(int i=1;i<=n;i++) u[i]=0;
	for(int i=1;i<=cnt&&su[i]<=n;i++){
		ll temp=su[i];
		while(temp<=n){
			if(temp<=n) u[temp]=su[i];
			temp*=su[i];
		}
	}
	for(int i=2;i<=n;i++){
		if(u[i]){
			a=1LL*a*u[i]+b;
			a%=mod;
		}
	}
	printf("%lld\n",a);
}

树数数

智算之道2020复赛题目_第9张图片
智算之道2020复赛题目_第10张图片
智算之道2020复赛题目_第11张图片

你可能感兴趣的:(--------【训练赛】)