目录
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(快速幂+小费马定理)
【分析】就是求。但是,n的范围太大了,所以普通求幂肯定不行。所以,要用到快速幂+小费马定理。
【费马小定理】假如p是质数,且gcd(a,p)=1,那么≡1(mod p),例如:假如a是整数,p是质数,则a,p显然互质(即两者只有一个公约数1),假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于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种船,每种船有 只,承重为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;
}