您的位置:首页 > 其它

笨小猴 2008年NOIP全国联赛提高组

2017-05-15 20:09 232 查看
题目描述 Description

笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!

这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案。

输入描述 Input Description

输入文件word.in只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100。

输出描述 Output Description

输出文件word.out共两行,第一行是一个字符串,假设输入的的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”;

第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn的值,否则输出0。

样例输入 Sample Input

样例一

error

样例二

olympic

样例输出 Sample Output

样例一

Lucky Word

2

样例二

No Answer

0

数据范围及提示 Data Size & Hint
模拟+米勒拉宾素性判定
莫名想笑

#include<cstdio>
#include<iostream>

using namespace std;
int dic[27];

string a;

int qpow(int a,int b,int r)//快速幂
{
int ans=1,buff=a;
while(b)
{
if(b&1)ans=(ans*buff)%r;
buff=(buff*buff)%r;
b>>=1;
}
return ans;
}

bool Miller_Rabbin(int n,int a)//米勒拉宾素数测试
{
int r=0,s=n-1,j;
if(!(n%a))
return false;
while(!(s&1))
{
s>>=1;
r++;
}
int k=qpow(a,s,n);
if(k==1)
return true;
for(j=0;j<r;j++,k=k*k%n)
if(k==n-1)
return true;
return false;
}
bool IsPrime(int n)//判断是否是素数
{
int tab[]={2,3,5,7};
for(int i=0;i<4;i++)
{
if(n==tab[i])
return true;
if(!Miller_Rabbin(n,tab[i]))
return false;
}
return true;
}

int main()
{
cin>>a;
int minn=0x7fffffff;
int maxn=-111;
for(int i=0;i<a.size();i++)
{
//if(a[i]==' ')continue;
//if(a[i]<'a') a[i]+='a'-'A';
dic[int(a[i]-'a')]++;

}
for(int i=0;i<26;i++)
{
if(dic[i]&&dic[i]>maxn)maxn=dic[i];
if(dic[i]&&dic[i]<minn)minn=dic[i];
}
int pos=maxn-minn;
if(pos!=1)
if(IsPrime(pos))
{
cout<<"Lucky Word"<<endl<<pos;
return 0;
}

cout<<"No Answer"<<endl<<"0";
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: