文章目录
- 1002 Kanade Doesn't Want to Learn CG 数学思维
- 1004 Primality Test 思维 简单题
- 1006 Nun Heh Heh Aaaaaaaaaaa 动态规划+组合数
题目集地址 2021中国大学生程序设计竞赛(CCPC)- 网络选拔赛(重赛)
1002 Kanade Doesn’t Want to Learn CG 数学思维
题目地址1002 Kanade Doesn’t Want to Learn CG
题目大意:给一个二次函数作为篮球投篮的抛物线,给出4个坐标表示篮筐和篮板,问这个篮球能不能穿过篮筐,不能碰到篮筐的两个边缘,图例如下:
思路:计算函数的值,保证A点的函数值大于A的纵坐标,C点的函数值小于等于C点的纵坐标,对于反弹的情况只需要将A点关于CD对称到A1点,A1点处的函数值小于A1的纵坐标。
有一个坑点就是B点碰到也不算是能得分。
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve()
{
ll a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
ll x0,x1,y0,y1,y2;
scanf("%lld%lld%lld%lld%lld",&x0,&x1,&y0,&y1,&y2);
ll x2=x1+x1-x0;
ll tea=1ll*a*x0*x0+b*x0+c;
ll teb=1ll*a*x1*x1+b*x1+c;
ll tec=1ll*a*x2*x2+b*x2+c;
if(tea>y0&&teb<=y2&&tec<y0&&teb!=y0)
printf("Yes\n");
else
printf("No\n");
}
int main()
{
int t=1;
scanf("%d",&t);
while(t--)
{
solve();
}
return 0;
}
1004 Primality Test 思维 简单题
题目地址1004 Primality Test
题目大意:定义
f
(
x
)
是
大
于
x
f(x)是大于x
f(x)是大于x的最小质数,最后就是判断两个相邻质数的平均数向下取整是不是合数就好了
思路:我们发现除了2和3两个相邻质数的平均值是质数其他的都是合数
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve()
{
ll a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
ll x0,x1,y0,y1,y2;
scanf("%lld%lld%lld%lld%lld",&x0,&x1,&y0,&y1,&y2);
ll x2=x1+x1-x0;
ll tea=1ll*a*x0*x0+b*x0+c;
ll teb=1ll*a*x1*x1+b*x1+c;
ll tec=1ll*a*x2*x2+b*x2+c;
if(tea>y0&&teb<=y2&&tec<y0&&teb!=y0)
printf("Yes\n");
else
printf("No\n");
}
int main()
{
int t=1;
scanf("%d",&t);
while(t--)
{
solve();
}
return 0;
}
1006 Nun Heh Heh Aaaaaaaaaaa 动态规划+组合数
题目地址1006 Nun Heh Heh Aaaaaaaaaaa
题目大意:给定一个字符串查找满足条件的子序列的个数,条件如下:前缀为nunhehheh,后缀必须有至少一个a。
思路:当有n个a结尾时,是一个组合数,总的情况数为
2
n
2^n
2n-1种,我们先倒序统计一下某一位置后面a的个数,然后统计到某一位置时前缀的个数,两数相乘,然后将所有位置的值累加即可
坑点:取模的时候有减法一定记得加MOD,就像是取模运算有除法记得乘乘法逆元一样。我们就是没加MOD结果wa了。
AC代码:
#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const int N = 1e5+5;
const int MOD = 998244353;
ll dp[10];
int numa[N];
char sstr[100] = "nunhehheh";
ll qpow(int x)
{
ll res = 1;
ll a = 2;
while(x)
{
if(x&1)
{
res = res*a%MOD;
}
a=a*a%MOD;
x>>=1;
}
return res;
}
void solve()
{
char str[N];
scanf("%s",str);
int len = strlen(str);
int num=0;
for(int i = len-1;i >=0 ;i--)
{
if(str[i]=='a')
{
num++;
}
numa[i]=num;
}
dp[0]=1;
ll ans = 0;
for(int i = 0;i < len;i++)
{
ll t = dp[9];
for(int j = 9;j>=1;j--)
{
if(str[i] == sstr[j-1])
{
dp[j] = (dp[j] + dp[j-1]) % MOD;
}
}
ans = (ans+(dp[9]-t+MOD)*(qpow(numa[i])-1+MOD)%MOD)%MOD;
//就是在这里,之前没加MOD导致一直过不了,后来发现这个问题,加上MOD之后就过了。。。
}
printf("%lld\n",ans);
memset(dp,0,sizeof(dp));
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int t;
scanf("%d",&t);
while(t--)
{
solve();
}
return 0;
}