计蒜客ACM-ICPC 2018 焦作赛区网络预赛 A题 G题 I题 K题

目录

A Magic Mirror(水)

G Give Candies(快速幂+小费马定理)

I Save the Room(水)

K Transport Ship(多重背包裸题)



A Magic Mirror(水)

【分析】签到题。注意不区分大小写。注意看题;

【代码】

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        string s;
        cin>>s;
        int len=s.length();
        for(int i=0;i<len;i++)
            	s[i]=tolower(s[i]);
        if(s=="jessie")printf("Good guy!\n");
        else printf("Dare you say that again?\n");
    }
    return 0;
}

G Give Candies(快速幂+小费马定理)

【分析】就是求2^{^{n-1}}。但是,n的范围太大了,所以普通求幂肯定不行。所以,要用到快速幂+小费马定理。

【费马小定理】假如p是质数,且gcd(a,p)=1,那么a^{^{p-1}}≡1(mod p),例如:假如a是整数,p是质数,则a,p显然互质(即两者只有一个公约数1),假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。

我们要求2^{^{n-1}},构造一下

所以,有两个mod,mod1=1e9+7,mod2=1e9+6;

【代码】

#include<bits/stdc++.h>
using namespace std;
const int mod1=1e9+7;
const int mod2=1e9+6;
const int maxn=1e5+5;
char n[maxn];
long long quickpow(long long a,long long b)
{
	long long ans=1;
	while(b)
	{
		if(b%2==1)
			ans=ans*a%mod1;
		a=a*a%mod1;
		b=b/2;
	}
	return ans;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%s",n);
		if(n=="1")
		{
			printf("1\n");
			continue;
		}
		int len=strlen(n);
		if(n[len-1]>'0')
			n[len-1]--;
		else{
			n[len-1]='9';
			int pos=len-2;
			while(n[pos]=='0')
			{
				n[pos]='9';
				pos--;
			}
			n[pos]--;
		}
		long long ans=0;
		for(int i=0;i<len;i++)
		{
			ans=ans*10+(n[i]-'0');
			ans%=mod2;
		}
		ans=quickpow(2,ans);
		ans%=mod1;
		printf("%lld\n",ans);
	}
	return 0;
}

 

I Save the Room(水)

【分析】 水题,不要想复杂了。体积除一除能整除就可以了。能有一组满足就可以了。不要想多!!!

【代码】

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a,b,c;
    while(~scanf("%d%d%d",&a,&b,&c))
    {
        if((a*b*c)%2==0)
            	printf("Yes\n");
    	else printf("No\n");
    }
    return 0;
}

K Transport Ship(多重背包裸题)

【题意】有n种船,每种船有2^{c_{i}}-1 只,承重为v,求选择若干艘船装满重量为S的方案总数。

【思路】多重背包问题;

  • 多重背包:给定n种不同的物品,每种物品有各自的价值v[i]与重量w[i],每个物品最多只能拿c[i]个。问,给你容量为m的背包,怎样才能取得最大价值。

嗯。。这是一道裸的多重背包题。─━ _ ─━  背包啊~ 还是要静下心来好好搞搞

【代码】

#include<bits/stdc++.h>
using namespace std;        
const int mod=1e9+7;
const int maxn=1e4+5;
int v[maxn],c[maxn];
int dp[maxn];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n,q;
		scanf("%d%d",&n,&q);
		for(int i=1;i<=n;i++)
			scanf("%d%d",v+i,c+i);
		memset(dp,0,sizeof(dp));
		dp[0]=1;
		for(int i=1;i<=n;i++)
		{
			int t=1;
			for(int j=1;j<=c[i];j++)
			{
				for(int k=10000;k>=t*v[i];k--)
					dp[k]=(dp[k]+dp[k-t*v[i]])%mod;
				t<<=1;
			}
		}
		while(q--)
		{
			int x;
			scanf("%d",&x);
			printf("%d\n",dp[x]);
		}
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值