Codeforces Round #146 (Div. 2)

这次的前三题本来都是些比较水的题,为什么我还是只能这么慢..哎...

A
standard input/output
1 s, 256 MB
Submit Add to favourites  x1435
A题异常的简单,用一个h[]记录一下出现过的字母,用一个total记录一下不同字母的个数即可

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
using namespace std;
char x[1000];
int h[1000];
int main()
{ 
      while(cin>>x)
      {
         int n=strlen(x);
         int total=0;
         memset(h,0,sizeof(h));
         for(int i=0;i<n;i++)
         {
              if(h[x[i]]==0)
              {
                 h[x[i]]=1;
                 total++;              
              }
          }
          if(total%2==0)cout<<"CHAT WITH HER!"<<endl;
          else cout<<"IGNORE HIM!"<<endl;
      }
      return 0;
}

B
standard input/output
2 s, 256 MB
Submit Add to favourites  x931
B题花了我好长时间,不划算啊!!!结果是打了个素数表,然后求得10^6以内所有数的、因数个数

假设有n=a1^x1*a2^x2*.....*an^xn,那么这个数的因素的个数就是(x1+1)(x2+1)...(xn+1)

算法确实不给力,所以才花了较长时间...

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1000005;
int mod=1073741824;
int x[N];
int prime[N];
int re[N];
int cnt;
void getprime()
{
   memset(prime,0,sizeof(prime));
   cnt=0;
   prime[1]=1;
   for(int i=2;i<=1000000;i++)
   {
       if(prime[i]==1)continue;
       for(int j=i+i;j<=1000000;j+=i)prime[j]=1;
   }
   for(int i=1;i<=1000000;i++)
     if(prime[i]==0)re[++cnt]=i;
}
int div(int n)
{
   int ans=1;
   for(int i=1;re[i]*re[i]<=n;i++)if(n%re[i]==0)
   {
       int tmp=1;
       n=n/re[i];
       while(n%re[i]==0)
       {
          tmp++;
          n=n/re[i];   
       }
       ans*=tmp+1;
   }
   if(n>1)ans*=2;
   return ans;
}
int main()
{
   getprime();
   memset(x,0,sizeof(x));
   x[1]=1;
   for(int i=2;i<=1000000;i++)
       x[i]=div(i);
   int a,b,c;
   while(scanf("%d%d%d",&a,&b,&c)!=EOF)
   {
       int ans=0;
       for(int i=1;i<=a;i++)
         for(int j=1;j<=b;j++)
           for(int k=1;k<=c;k++)
           {
               int tmp=i*j*k;
               ans=(ans+x[tmp])%mod;       
           }
       printf("%d\n",ans);       
   }   
}
C
standard input/output
2 s, 256 MB
Submit Add to favourites  x501
c题其实非常的简单,只需要简单的找一下规律即可,最简单的规律就是n为偶数和奇数时的不同。当n为奇数时答案就是n*(n-1)*(n-2).因为n和n-1一偶一奇,肯定互质

然后n-1和n-2也是一样的道理,在然后,n和n-2因为同是奇数,又只相差2,所以也肯定互质。所以答案就是取最接近n的3个数。

当n为偶数时,可以发现n和n-2有2这个公约数,因为都是偶数嘛,然后我们就再往下,走就发现了n-3,是个奇数,但是因为是相差3,所以存在n和n-3均为3的倍数的

情况,即是n为六的倍数,这个时候就可以把n当成n-1来算,因为(n-1)*(n-2)*(n-3)一定比n*(n-1)*k,k<n-3,的数大。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{
    ll n;
    while(cin>>n)
    {
        if(n==1)cout<<1<<endl;
        else if(n==2)cout<<2<<endl;
        else if(n&1)cout<<n*(n-1)*(n-2)<<endl;
        else 
        {
           if(n%6==0)cout<<(n-1)*(n-2)*(n-3)<<endl;
           else cout<<n*(n-1)*(n-3)<<endl;
        }                          
    }    
    return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值