1. 程式人生 > >ssl提高組週四備考賽【2015.10.18】

ssl提高組週四備考賽【2015.10.18】

前言

開始做四面八方扣來的題

成績

RankRank PersonPerson ScoreScore AA BB CC
11 2017zyc2017zyc 160160 7070 3030 6060
22 2017wyc2017wyc 140140 8080 1010 5050
33 2017lrz2017lrz 140140 4040 100100 00
44 2017xjq2017xjq 100100 7070 3030 00
55 2017xxy2017xxy 100100 7070 3030 00
66 2015g
jh2015gjh
100100 00 00 100100
77 2017hjq2017hjq 7070 4040 3030 00
88 2017lw2017lw 7070 4040 3030 00
99 2015yjy2015yjy 7070 4040 3030 00
1010 2015zyf2015zyf 7070 4040 00 3030

正題

T1:nssl1194T1:nssl1194-春思【逆元,等比數列,約數】

T2:nssl1195T2:nssl1195-健美貓【??????

T3:nssl1196T3:nssl1196-
摘果子【樹形依賴揹包,dp,dp

someofcodesome\ of\ code

T1 80分code

#include<cstdio>
#include<algorithm>
#define mod 9901
#define ll long long
using namespace std;
ll pr[50],c[50],a,b,cnt,ans;
void prime(ll a)
{
	for(ll i=2;i*i<=a;i++)
	{
		if(!(a%i))
		{
			pr[++cnt]=i;
			while
(!(a%i)) c[cnt]++,a/=i; } } if(a!=1) pr[++cnt]=a,c[cnt]=1; } ll power(ll a,ll b) { ll ans=1; while(b) { if(b&1) ans=(ans*a)%mod; a=(a*a)%mod;b>>=1; } return ans; } int main() { scanf("%lld%lld",&a,&b); prime(a); ans=1; for(ll i=1;i<=cnt;i++) { ll inx=power(pr[i]-1,mod-2); if(!inx) { ans=ans*((c[i]*b+1)%mod)%mod; continue; } ll k=(power(pr[i],c[i]*b+1)+mod-1)%mod*inx%mod; ans=ans*k%mod; } printf("%lld",ans); }

T2 10分code

#include<cstdio>
#include<algorithm>
#define N 2000010
using namespace std;
int n,s[N*2],ans,sum;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	  scanf("%d",&s[i]),s[i+n]=s[i];
	ans=1;
	int i=2;
	while(i<=2*n)
	{
		if(s[i]<s[ans])
		{
			ans=i;
			i++;
			continue;
		}
		if(s[i]>s[ans])
		{
			i++;
			continue;
		}
		int k=1;
		while(i+k<=2*n&&s[i+k]==s[ans+k]) 
		  k++;
		if(i+k>2*n) break;
		if(s[i]>s[i+k])
			ans=i+k;
		else if(s[ans+k]>s[i+k]) 
			ans=i;
		i+=k+1;
	}
	for(i=ans;i<ans+n;i++)
	  sum+=abs(s[i]-(i-ans+1));
	printf("%d",sum);
}

T3 50分code

#include<cstdio>
#include<algorithm>
#define N 2010
using namespace std;
struct node{
	int to,next;
}a[N];
int n,m,v[N],p[N],ls[N],f[N][N],tot,x,y;
void addl(int x,int y)
{
	a[++tot].to=y;
	a[tot].next=ls[x];
	ls[x]=tot;
}
void dp(int x,int fa)
{
	for(int i=ls[x];i;i=a[i].next)
	{
		int y=a[i].to;
		if(y==fa) continue;
		dp(y,x);
		for(int j=m;j>=p[y];j--)
		{
		    for(int k=p[y];k<=j;k++)
			  f[x][j]=max(f[x][j],f[x][j-k]+f[y][k]);
		}
	}
	for(int j=m;j>=p[x];j--)
	  f[x][j]=f[x][j-p[x]]+v[x];
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d%d",&v[i],&p[i]);
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&x,&y);
		addl(x,y);
		addl(y,x);
	}
	dp(1,0);
	printf("%d",f[1][m]);
}

尾聲

沒了