C. Cats
小E有n个猫咪排成一行。对于1到20之间的每个整数高度,有足够多的猫具有该高度。他应该选择n只猫放在这些大教堂里。每个大教堂应该只容纳一只猫。然而,这些猫有一个特殊的习惯。对于每两只身高相同的不同的猫来说,它们无法忍受相邻的生活,而且它们无法忍受住在它们之间的天主殿里最矮的猫的身高大于或等于它们的身高。
对于小E来说,要想找到一个让所有住在大教堂里的猫都满意的方案太难了。你能帮助他吗?
- #include<bits/stdc++.h>
- using namespace std;
- int main()
- {
- int n,i;
- cin>>n;
- int a[20];
- for(i=1;i<=18;i++)
- {
- a[i]=pow(2,i);
- }
- int b[1000010];
- int k;
- for(i=1;i<=18;i++)
- {
- if(n<=a[i])
- {
- k=i+1;
- break;
- }
- }
- int t=k,s=0;
- while(k--)
- {
- b[(int)pow(2,s++)]=k+1;
- for(i=pow(2,s-1);i<=pow(2,t);i+=pow(2,s))
- {
- b[i]=k+1;
- }
- }
- for(i=1;i<n;i++)
- cout<<b[i]<<" ";
- cout<<b[n]<<endl;
- return 0;
- }
J Just Multiplicative Inverse
- #include<bits/stdc++.h>
- typedef long long ll;
- using namespace std;
- const int maxn=1e6+9;
- int dp[maxn];
- int ans=0;
- int F(int x,int p){
- if(dp[x])return ans=ans+dp[x];
- ans++;
- if(x<=1)
- {
- // if(dp[x]==0)dp[x]=ans;
- return dp[x]=ans;
- }
- else
- {
- return dp[x]=F(p%x,p);
- }
- }
- int main()
- {
- int t;
- cin>>t;
- while(t--)
- {
- int n;
- cin>>n;
- double sum=0;
- memset(dp,0,sizeof(dp));
- for(int i=1;i<n;i++)
- {
- ans=0;
- sum+=1.0*F(i,n);
- }
- //cout<<sum<<endl;
- printf("%.10f\n",sum/((n-1)*1.0));
- // cout<<calu(n);
- }
- return 0;
- }
H Happy Morse Code
小兔子和小马最近学习了摩尔斯电码,发现只有破折号和圆点两个符号可以表达无数个单词,因为每个字母都有一个独特的破折号-圆点字符串对应关系。小兔子和小马得到了错误的结论,因为破折号字符串不一定对应一个字母,它也可能对应一个数字,或者它可能对应一个表示开始、中断和结束的句子。无论如何,他们计划用0表示点,用1表示破折号,用二进制字符串表示他们自己的快乐莫尔斯电码。他们为每个字母随机分配一个二进制字符串,并将其制成密码本。给定一个二进制字符串,小兔子和小马的密码本能唯一地解释字符串的含义吗?如果是,则输出happymorsecode;如果存在多个可能的解释,则输出puppymousecat和可行解释的数量模128;如果根本无法解释,则输出nono。
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn=100010;
ll dp[maxn];
string s;
string z[100];
ll zlen[100]={0};
ll flag[100010]={0};
int t,m,n;
int main()
{
scanf("%d",&t);
while (t--) {
scanf("%d%d",&n,&m);
memset(dp,0,sizeof(dp));
memset(zlen,0,sizeof(zlen));
memset(flag,0,sizeof(flag));
string x;
for(int i=1;i<=m;i++)
{
cin>>x>>z[i];
zlen[i]=z[i].length();
}
cin>>s;
dp[0]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(i-zlen[j]>=0)
{
string ww=s.substr(i-zlen[j],zlen[j]);
if(ww==z[j])
{
if(dp[i-zlen[j]]==0&&flag[i-zlen[j]]==1)
{
//dp[i]+=0;
flag[i]=1;
}
else if(dp[i-zlen[j]]>0){dp[i]+=dp[i-zlen[j]];if(flag[i-zlen[j]]==1)flag[i]=1;}
if(dp[i]>=128){dp[i]%=128;flag[i]=1;}
}
}
//cout<<flag[i]<<" "<<dp[i]<<endl;
}
}
if(flag[n]==1)
{
printf("puppymousecat %d\n",dp[n]);
}
else
{
if(dp[n]==0)printf("nonono\n");
else if(dp[n]==1)printf("happymorsecode\n");
else printf("puppymousecat %d\n",dp[n]);
}
}
return 0;
}