这次的前三题本来都是些比较水的题,为什么我还是只能这么慢..哎...
#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;
}
假设有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);
}
}
然后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;
}