分火腿
(hdogs.pas/.c/.cpp)
时间限制:1s;内存限制 64MB
题目描述:
小月言要过四岁生日了,她的妈妈为她准备了n根火腿,她想将这些火腿均分给m位小朋友,所以她可能需要切火腿。为了省事,小月言想切最少的刀数,使这n根火腿分成均等的m份。请问最少要切几刀?
输入描述:
第一行一个整数T,表示有T组数据。
接下来T组数据,每组共一行,有两个数字n,m。
输出描述:
每组数据一行,输出最少要切的刀数。
样例输入:
2
2 6
6 2
样例输出:
4
0
数据范围:
100%的数据保证T<=1000;n,m<=2147483647。
/*数论题 似乎搞麻烦了 可以化简*/ #include<iostream> #include<cstdio> #define ll long long using namespace std; ll T,n,m,lcm,gcd; ll Gcd(ll x,ll y){ return y?Gcd(y,x%y):x; } ll Lcm(ll x,ll y){ return x/Gcd(x,y)*y; } int main() { freopen("hdogs.in","r",stdin); freopen("hdogs.out","w",stdout); cin>>T; while(T--){ cin>>n>>m; gcd=Gcd(n,m); n/=gcd;m/=gcd; lcm=Lcm(n,m); ll x=(lcm-n)/n*gcd; cout<<x<<endl; } return 0; }
无聊的会议
(meeting.pas/.c/.cpp)
时间限制:1s;内存限制 128MB
题目描述:
土豪学长作为一名光荣的学生会干部,每天要参加很多无聊的会议。他发现:他开会的会议桌一定是正n边形,n个干部坐在这个多边形顶点上。因为太无聊了,所以他想要数出所有的“完全”等腰三角形——这种等腰三角形的三个顶点一定全是给出n多边形的顶点,且三个顶点上坐的干部性别相同。
土豪学长是土豪,他用1000000000%10的佣金雇用你,让你帮他数。PS:如果两个“完全”等腰三角形三个顶点相同,计算时只算一个。
输入描述:
第一行一个数字T,表示有T组数据。
接下来有T组数据,每组数据共一行。这一行给出一个长度为n的字符串,表示正n边形n个顶点上干部的性别。1为男,0为女。
输出描述:
对于第i组数据:输出”Case i: ans”(不带引号),ans为“完全”等腰三角形的数量。
样例输入:
5
0001
01
10001
1101010
111010
样例输出:
Case 1: 1
Case 2: 0
Case 3: 1
Case 4: 3
Case 5: 2
数据范围:
40%的数据保证n<=20
100%的数据保证 n<=10^6
所有数据保证T<=10
/* n*n*n暴力40 开始傻逼的写x==y==z.... 正解比较神奇 看不懂....又没有注释 于是弃疗了QAQ */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 2000010 using namespace std; int T,n,ans,sum,cas,x,y,z; char s[maxn]; int main() { //freopen("meeting.in","r",stdin); //freopen("meeting.out","w",stdout); scanf("%d",&T); while(T--){ scanf("%s",s); n=strlen(s);ans=0;sum=0 for(int i=0;i<n;i++) s[i+n]=s[i]; for(int i=0;i<n;i++) for(int j=i+1;j<n+i;j++) for(int k=j+1;k<n+i;k++) if(s[i]==s[j]&&s[j]==s[k]){ x=j-i;y=k-j;z=n*2-k+i-n; if(x==y&&y==z)sum++; else if(x==y||y==z||x==z)ans++; } ans/=3; if(n%3==0)ans+=sum/3; printf("Case %d: %d ",++cas,ans); } return 0; }
班服
(shirt.pas/.c/.cpp)
时间限制:1s;内存限制 128MB
题目描述:
要开运动会了,神犇学校的n个班级要选班服,班服共有100种样式,编号1~100。现在每个班都挑出了一些样式待选,每个班最多有100个待选的样式。要求每个班最终选定一种样式作为班服,且该班的样式不能与其他班级的相同,求所有可能方案的总数,由于方案总数可能很大,所以要求输出mod 1000000007后的答案。
输入描述:
共有T组数据。
对于每组数据,第一行为一个整数n,表示有n个班级。
2~n+1行,每行有最多100个数字,表示第i-1班待选班服的编号。
输出描述:
对于每组数据,输出方案总数 mod 1000000007后的答案。
样例输入:
2
3
5 100 1
2
5 100
2
3 5
8 100
样例输出:
4
4
数据范围:
对于30%的数据,1<=T<=3, 1<=n<=3,每班待选样式不超过10种。
对于50%的数据,1<=T<=5, 1<=n<=5,每班待选样式不超过50种。
对于100%的数据,1<=T<=10, 1<=n<=10,每班待选样式不超过100种。
/*简单的状丫 考试没时间了 打了50的暴力*/ #include<iostream> #include<cstdio> #include<cstring> #define maxn 3010 #define mod 1000000007 using namespace std; int T,n,c[110][110],f[110][maxn],ans,x; char s; void Solve(){ f[0][0]=1;//f[i][j]表示前i种服装 选不选的状态集合为j的方案数 for(int i=1;i<=100;i++) for(int j=0;j<(1<<n);j++){ f[i][j]+=f[i-1][j]; for(int k=1;k<=c[i][0];k++) if(j&(1<<c[i][k]-1)){ f[i][j]+=f[i-1][j-(1<<c[i][k]-1)]; if(f[i][j]>mod)f[i][j]%=mod; } } } int main() { freopen("shirt.in","r",stdin); freopen("shirt.out","w",stdout); scanf("%d",&T); while(T--){ ans=0;scanf("%d",&n); memset(c,0,sizeof(c)); memset(f,0,sizeof(f)); for(int i=1;i<=n;i++){ while(1){ scanf("%d",&x); c[x][++c[x][0]]=i; s=getchar(); if(s==' ')break; } } Solve(); printf("%d ",f[100][(1<<n)-1]); } return 0; }
conclusion
今天170 题目比较水 不是很高 而且 暴力分 没 的 全 QAQ T1 数论啊 找找规律就水过了 T2 不会正解啊 想了好久也没想出来.... 最后还是暴力 40%的数据保证n<=20 100%的数据保证 n<=10^6 被数据坑了又 上次以为会有几个在这范围之间的 然后出了%40剩下都是最大的数据 还浪费了好久 这次长记性了 反正慢了 n*n*n和n*n区别不大 然而一个40 一个50 而且40的还打wa了 x==y==z..... 暴力wa了就很蛋疼了 又不能排... T3 时间不多了 10分钟暴力... 正解简单状丫dp 应该能想出来的 可是吧 QAQ 总之还是能打快的就打快的 特别是数据范围不清楚的时候 还有就是 不要一个题卡太久 有时候说不定T3比T2好想