标签:作业 方案 分支 php string prime 技术 map algo
比赛网址 http://47.96.116.66/contest.php?cid=1376
A题:分组
5
11 17 3 2 20
3
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> #include<map> #include<vector> const int N=1e5+5; int sum1,sum2,a[N]; int n,i,j; using namespace std; int main() { int ans=0x3f3f3f; sum1=0; sum2=0; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&a[i]); sum1+=a[i]; } for(i=1;i<=n;i++) { sum2+=a[i]; ans=min(ans,abs(sum2-sum1+sum2)); } printf("%d\n",ans); }
B题:数学老师的难题
2 6
13
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> #include<map> #include<vector> long long n,m,i,j; long long sum2,sum1; using namespace std; int main() { sum1=0; sum2=0; scanf("%lld%lld",&n,&m); long long maxx,minn; minn=min(n,m); maxx=max(n,m); n=minn; m=maxx; for(i=1;i<n;i++) { sum1+=(n-1)/i; } for(i=1;i<=m;i++) { sum2+=m/i; } //printf("%d\n",sum1); //printf("%d\n",sum2); printf("%lld\n",sum2-sum1); }
【输入样例1】
5 5 8
1 2 3 4 5 10 9 8 7 6 25 24 23 22 21 18 16 17 19 20 11 13 12 14 15
【输入样例2】
4 3 12
3 8 12 3 8 12 3 8 12 8 12 17
【输出样例1】
1 5
【输出样例2】
1 2
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<vector> #include<cmath> using namespace std; const int N=1e6+5; int data[N],up[N],down[N]; int i,j,n,f,m,goal; int median; int needc; int ans,num; int main() { memset(down,0,sizeof down); memset(up,0,sizeof up); scanf("%d%d%d",&f,&m,&goal); for(i=1;i<=f*m;i++) { scanf("%d",&data[i]); if(data[i]<goal) { down[(i-1)/m]++; } else if(data[i]>goal) { up[(i-1)/m]++; } } sort(data+1,data+1+f*m); sort(up,up+f); sort(down,down+f); median=data[(1+f*m)/2]; if(median==goal) printf("0 0\n"); else { if(median>goal) { needc=(1+f*m)/2-(upper_bound(data+1,data+1+f*m,goal)-data-1); } else { needc=lower_bound(data+1,data+1+f*m,goal)-data-1-(1+f*m)/2+1; } //printf("%d\n",median); //printf("%d\n",needc); num=needc; ans=0; if(median>goal) { while(needc>0) { needc-=up[f-1]; f--; ans++; } } else if(goal>median) { while(needc>0) { needc-=down[f-1]; f--; ans++; } } printf("%d %d\n",ans,num); } }
【样例输入1】
2 2
【样例输入2】
2 1
【样例输入3】
1234 3
【样例输出1】
8
【样例输出2】
8
【样例输出3】
180608
思路:先得搞清楚,在某个方向上,能抓到C只老鼠(不包括原点),则每只老鼠横坐标的间隔范围是多少?考虑两个极值:1,恰好第C只老鼠的横坐标为N,则distance=N/C。2,恰好第C+1只老鼠的横坐标为N(无法取到),则distance=N/(C+1);所以distance∈[N/C,N/(C+1))。我们先随便确定一个K∈[N/C,N/(C+1)),则K可以作为第一只抓到的老鼠的横坐标,这只老鼠的纵坐标可能大于K吗?不能,否则第C只老鼠的纵坐标将会大于N,所以第一只老鼠的Y<=X,那么,X和Y能有除1以外的因数吗?也不能。例如:假设X和Y有公因数2,则(X/2,Y/2)这个点的老鼠肯定会在之前被抓,还有(3X/2,3Y/2)的老鼠...这意味着如果X和Y有公因数(不为1)的话,猫抓到的老鼠是大于C的,即所有Y值的可能为<X的与X互质的数的个数,即X的欧拉函数,最后考虑坐标系的对称性*8即可(还有X==Y的特殊情况,这种情况下猫在沿X轴和斜45°能抓到一样多的老鼠,故同样算作欧拉函数)。
代码:
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; int n,m,M,C; const int N=5e6+5; long long oula[N]; long long prime[N]; long long vis[N]; int a,b; void init(long long x) { memset(vis,0,sizeof vis); long long num=0; for(long long i=2;i<x;i++) { if(!vis[i]) { prime[num]=i; num++; oula[i]=i-1; } for(long long j=0;j<num&&i*prime[j]<x;j++) { vis[i*prime[j]]=1; if(i%prime[j]==0) { oula[i*prime[j]]=prime[j]*oula[i]; break; } else { oula[i*prime[j]]=oula[i]*(prime[j]-1); } } } } int main() { while(scanf("%d%d",&M,&C)!=EOF) { int t1=M/C; int t2=M/(C+1)+1; long long sum=0; //printf("%d %d\n",t1,t2+1); init(t1+1); oula[1]=1; for(int i=t2;i<=t1;i++) { sum+=oula[i]; } printf("%lld\n",sum*8); } }
【样例输入1】
4
【样例输入2】
8
【样例输出1】
12
【样例输出2】
15120
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<vector> #include<cmath> using namespace std; const int mod=1e9+7; const int N=5e5+5; long long a[N]; int n,i,j,m; void DP(int x) { for(i=3;i<=x;i++) { a[i]=(i-1)*(a[i-1]+a[i-2])%mod; } return ; } int main() { a[1]=0; a[2]=1; scanf("%d",&n); m=n/2; DP(m); long long ans=1; for(i=n/2+1;i<=n;i++) { ans=ans*i%mod; } ans=ans*a[m]%mod; printf("%lld\n",ans); }
标签:作业 方案 分支 php string prime 技术 map algo
原文地址:https://www.cnblogs.com/switch-waht/p/11166424.html