目录
1002:Kanade Doesn't Want to Learn CG
1002:Kanade Doesn't Want to Learn CG
题意:
判断篮球(质点)是否能进球。
要求:质点不能碰到篮筐端点。
思路:
先不考虑端点判断:要么直接进球,要么弹进去。
最后判断端点。(我过程中判断端点WA了,玄学)。
代码:
#include <bits/stdc++.h>
#define bbn 200005
typedef long long int LL;
using namespace std;
LL t;
LL a,b,c;
LL f(LL x)
{
return a*x*x+b*x+c;
}
void work()
{
cin>>t;
while(t--)
{
LL x0,x1,y0,y1,y2;
cin>>a>>b>>c;
cin>>x0>>x1>>y0>>y1>>y2;
bool judge=0;
if(f(x0)>=y0)
{
if(f(x1)<=y0)
{
judge=1;
//cout<<"穿过"<<endl;
}
else
{
if(f(x1)<=y2)
{
if(f(2*x1-x0)<=y0)
{
judge=1;
// cout<<"反弹"<<endl;
}
}
}
}
if(f(x0)==y0||f(2*x1-x0)==y0||f(x1)==y0)
{
judge=0;
}
cout<<(judge==1?"Yes":"No")<<'\n';
}
}
int main()
{
work();
return 0;
}
1004:Primality Test
题意:
f(x)为大于x的最小素数;
g(x)=⌊( f(x) + f(f(x)) )/2⌋ ;
判断g(x)是否为素数。
思路:
相邻素数的平均数在这两个素数之间,相邻素数之间为合数(除了2,3)。
在数据范围内,只有1的结果是YES,其余都是NO。
代码:
HDOJ吞了。。。
1006:Nun Heh Heh Aaaaaaaaaaa
题意:
给一个字符串。
求"nunhehheh""a...a"的数量。
"nunhehheh"为子序列。可以不连续。
"a...a"至少有一个。
思路:
首先,cnt[x]数组记录x位置之后(>x)的字符’a‘的数量,从后向前扫。
其次,dp求"nunhehheh"子序列数量,过程中每扫一个字符,就结合cnt[]计算一次,
//
sum+="nunhehheh"子序列数量*(pow(2,cnt[pos])-1)
//
用到了快速幂取模(底为2)。
注意减法取模有负数,先加998244353,否则会WA。。。
代码:
#include <bits/stdc++.h>
#define bbn 1000005
typedef long long int LL;
using namespace std;
LL t,n;
LL p=998244353;
LL cnt[bbn];
char s1[bbn];
char s2[]=" nunhehheh";//有空格
LL dp[11][bbn];
LL quick_pow(LL n)
{
LL a=2;
LL ans=1;
while(n)
{
if(n&1)
{
ans=ans*a%p;
}
a=a*a%p;
n>>=1;
}
return ans;
}
LL f(LL x)
{
return quick_pow(x)-1;
}
void fdp()
{
for(LL i=0; i<10; i++)
{
memset(dp[i],0,sizeof(dp[i]));
}
LL sum=0;
for (LL i=1; i<=n; i++)
{
dp[1][i]=dp[1][i-1]+(s1[i]==s2[1]);
dp[1][i]%=p;
for(LL j=2; j<=9; j++)
{
dp[j][i]=dp[j][i-1]+dp[j-1][i-1]*(s1[i]==s2[j]);
dp[j][i]%=p;
}
sum+=(f(cnt[i])+p)%p*(dp[9][i]-dp[9][i-1]+p)%p;
sum%=p;
//cout<<i<<"::"<<cnt[i]<<"::"<<(dp[9][i]-dp[9][i-1])<<"::"<<dp[9][i]<<endl;
// cout<<sum<<'\n';
}
cout<<sum<<'\n';
}
void work()
{
cin>>t;
while(t--)
{
memset(cnt,0,sizeof(cnt));
string s;
cin>>s;
for(LL i=0; i<s.size(); i++)
{
s1[i+1]=s[i];
}
n=s.size();
for(LL i=n; i>=1; i--)
{
cnt[i-1]=cnt[i];
if(s1[i]=='a')
{
cnt[i-1]++;
}
}
fdp();
}
}
int main()
{
work();
return 0;
}