这次的题相对之前简单,A题和B题的类型看过,就敲了,不过写代码能力有待提高,有些 还会出小错误,多亏队友提醒,
A题不是1A,唉~它竟然不支持long long ==__Int 64,修改,A了
B题找规律,不过BNU不知哪里出错了,就是不判B题,后面赛后交A了
B题就是给出一个b进制的数,求该数%(b-1)后的结果,我当时的想法是把它转换成十进制看效果,对于一个数比如题目中的例子7 123456,把它转成十进制为(1*7^5+2*7^4+3*7^3+4*7^2+5*7^1+6*7^0)对它取模,发现7^(7-1)总==1
又有(a*b)%c=(a%c * b%c)%c; ,所以相当于(1*7^5+2*7^4+3*7^3+4*7^2+5*7^1+6*7^0)%(7-1)==(1*1+2*1+3*1+4*1+5*1+6*1)%(7-1) == (1+2+3+4+5+6)%(7-1),也就是把你输入的数各个位加起来%(b-1)就OK了
C题给出一个长度L,用它来组成一个三角形,三角形的边长是整数的,问可以组成多少种方案,就是我一直在画那个三角形,后面发现只要三角形三边都不相同,就是相当两种方案,A了,不过在杭电上TLE了,因为杭电限时1s,这里限时3s,唉~~有待优化吧 找到了方法,在杭电A了!代码在下面
解析:分三种情况:1 等边情况a=b=c s+=1;
2.等腰情况:a=b<c 由于 a+b>c--->2*a>n-2*a----->a>n/4 又a<c----->a<n-2*a----->a<n/3 则 n/4<a<n/3
a<b=c 由于 c>a---->c>n-2*c------>c>n/3 又 b+c<n--->c<n/2 则 n/3<c<n/2
3.三边不等情况 假设为 a<b<c 则a<b<n-a-b-----> (n-2*a)/2<b<(n-a)/2
然后我就是很耐心的判断奇偶情况,求出最终答案!
E题其实很简单,就是理清分子分母的问题,我又犯了一次错误,long long 竟然在输出的时候变成了int ,所以一直出不了结果,赛后A了~~~~~
J题:题意:给出一组字符串,在给出n个数,每次求和取出原串中的单词输出。
题意很简单,就是那个字母呀看着头晕,其实翥子已经写出来了,但是不明白为什么长度总是多出一位,我看了看也知道为什么,后面他叫我敲,我敲后是一样的结果,后面听说样例后面都多了一个空格!超级无语了!不然早A了....
A题代码:
#include <cstdio>//A
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int main() {
int t,a;
long long mmax,n;
scanf("%d",&t);
while(t--)
{
scanf("%d %I64d",&a,&n);
mmax=n;
while(n!=1)
{
if(n%2==0)
{
n=n/2;
mmax=max(n,mmax);
}
else
{
n=n*3+1;
mmax=max(n,mmax);
}
}
cout<<a<<" "<<mmax<<endl;
}
return 0;
}
B题代码:
#include <cstdio>//B
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
char s[10000001];
int main()
{
int t,a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%s",&a,&b,s);
int len=strlen(s);
int sum=0;
for(int i=0;i<len;i++)
sum+=(s[i]-'0');
int dd=sum%(b-1);
printf("%d %d\n",a,dd);
}
return 0;
}
C题代码:
#include <iostream>//C
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
int n,a,b;
scanf("%d",&n);
while(n--)
{
int s=0;
scanf("%d%d",&a,&b);
int lc=b/2,kk=1;
if(b%2 ==0)
{
lc-=1;
kk=2;
}
for(int i=lc; i>=kk; i--)
{
for(int j=i; j>=1; j--)
{
int k=b-i-j;
if(k>j)break;
if(k+j>i)//判断是否是三角形
{
if(i!=j && i!=k && j!=k)s+=2;
else
s+=1;
}
}
}
printf("%d %d\n",a,s);
}
return 0;
}
在杭电A的代码:
#include <stdio.h>//C
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
int t,aa,n;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&aa,&n);
int s=0;
if(n%3==0)s+=1;
int l=(n/4)+1;
int r=n/3;
if(n%3==0)r--;
if(r>=l)
s+=(r-l+1);
l=n/3+1;
r=n/2;
if(n%2==0)r--;
if(r>=l)
s+=(r-l+1);
for(int a=1;a< n/3;a++)
{
l=a+1;
int t=(n-2*a)/2+1;
r=(n-a)/2;
if((n-a)%2==0)
r--;
l=max(l,t);
if(r>=l)
s+=2*(r-l+1);
}
printf("%d %d\n",aa,s);
}
return 0;
}
E题代码:
#include <iostream>//E
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
//long long gcd(long long n,long long m)
//{
// if(n<m) swap(n,m);
// return n%m==0?m:gcd(m,n%m);
//}
//long long lcm(long long n,long long m)
//{
// if(n<m) swap(n,m);
// return n/gcd(n,m)*m;
//}
long long gcd(long long a,long long b)
{
if(b==0)return a;
return gcd(b,a%b);
}
long long lcm(long long a,long long b)
{
return (a*b)/gcd(a,b);
}
long long dp[420][420][2];
void ff()
{
dp[0][1][0]=1;
dp[0][1][1]=1;
dp[1][1][0]=1;
dp[1][1][1]=2;
dp[1][2][0]=1;
dp[1][2][1]=2;
long long f1,f2,s1,s2;
for(int i=2; i<=410; i++)
{
f1=f2=1;
for(int j=2; j<=i+1; j++)
{
dp[i][j][0]=i*dp[i-1][j-1][0];
dp[i][j][1]=j*dp[i-1][j-1][1];
s1=dp[i][j][0];
s2=dp[i][j][1];
if(s1==0 && s2==0) continue;
long long gg = gcd(s1,s2);
dp[i][j][0]/=gg;
dp[i][j][1]/=gg;
if(f1==0 && f2==0)
{
f1=-dp[i][j][0];
f2= dp[i][j][1];
continue;
}
long long l=lcm (f2,s2);
f1=f1*(l/f2)-s1*(l/s2);
f2=l;
}
if(f1==0)
{
dp[i][1][0]=0;
dp[i][1][1]=0;
}
else
{
long long gg = gcd(f1,f2);
f1/=gg;
f2/=gg;
dp[i][1][0]=f1;
dp[i][1][1]=f2;
}
}
}
int main()
{
ff();
// for(int i=0;i<=10;i++)
// {
// for(int j=1;j<=i+1;j++)
// {
// printf("%lld/%lld ",dp[i][j][0],dp[i][j][1]);
// }
// cout<<endl;
// }
int t,a,b,c;
scanf("%d",&t);
while(t--)
{
scanf("%d %d%d",&a,&b,&c);
if(dp[b][c][1]<0)
{
dp[b][c][0]*=-1;
dp[b][c][1]*=-1;
}
if(dp[b][c][0]==0)
printf("%d 0\n",a);
else if(dp[b][c][0]%dp[b][c][1]==0)
printf("%d %lld\n",a,dp[b][c][0]/dp[b][c][1]);
else
printf("%d %lld/%lld\n",a,dp[b][c][0],dp[b][c][1]);
}
return 0;
}
J 题代码:
#include <cstdio>//J
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
char a[1005];
int main()
{
int t,num,l,b;
scanf("%d",&t);
int sum ;
while(t--)
{
sum = 0;
cin>>num;
getchar();
gets(a);
int len=strlen(a);
scanf("%d",&l);
printf("%d ",num);
int g=0;
while(l--)
{
scanf("%d",&b);
sum += b;
sum = (sum + len) % len;
printf("%c",a[sum]);
}
printf("\n");
}
return 0;
}