T1
大水题,题里咋说你就咋做,AC
思路:大水题
1 #include <bits/stdc++.h> 2 using namespace std; 3 int t; 4 long long n,ans; 5 int main(){ 6 scanf("%d",&t); 7 while(t--){ 8 scanf("%lld",&n); 9 ans=0; 10 if(n==1){printf("0 ");continue;} 11 while(n!=1){ 12 while(n%2==0) ans+=1,n/=2; 13 while(n%3==0) ans+=2,n/=3; 14 while(n%5==0) ans+=3,n/=5; 15 if(n==1) break; 16 if(n%2!=0&&n%3!=0&&n%5!=0){ans=-1;break;} 17 } 18 printf("%lld ",ans); 19 } 20 return 0; 21 }
T2
思维题,细节较多,总体不难
zkc大佬提醒您:十年OI一场空,不开long long见祖宗
思路:模拟deque找到序列中最大的值在第一位的时候,
我们就可以确定,他后面序列会按最大值在第一位时的位置
无限循环,当时我们只需特判即可.
1 #include <bits/stdc++.h> 2 using namespace std; 3 long long n,nq,tail; 4 long long x,qwq,stop,maxx,ac; 5 long long a[400010]; 6 long long m[300010]; 7 long long ans[200020][3]; 8 int main(){ 9 scanf("%lld%lld",&n,&nq); 10 tail=n; 11 for(register int i=1;i<=n;i++) scanf("%lld",&a[i]),maxx=max(maxx,a[i]); 12 //printf("%lld ",maxx); 13 for(register int i=2;i<=n;i++){ 14 ans[i-1][1]=a[i-1]; 15 ans[i-1][2]=a[i]; 16 a[++tail]=min(a[i],a[i-1]); 17 a[i]=max(a[i],a[i-1]); 18 if(a[i]==maxx){stop=i;break;} 19 } 20 //for(register int i=1;i<=n;i++) printf("%lld %lld ",ans[i][1],ans[i][2]); 21 //for(register int i=1;i<=tail;i++) printf("%lld ",a[i]); 22 for(register int i=1;i<=nq;i++){ 23 scanf("%lld",&x); 24 if(x<stop) printf("%lld %lld ",ans[x][1],ans[x][2]); 25 else if(x>=stop){ 26 ac=(x-stop)%(n-1)+1; 27 //if(ac==0) ac=n-1; 28 printf("%lld %lld ",maxx,a[stop+ac]); 29 } 30 } 31 return 0; 32 }
T3
也是思维题,比较水
思路:光哥每次查房,咱们给他记录一个vis
如果后来光哥查的一间房和光哥之前查的一间房相邻
那就把那间房往这边位移的方案不要
1 #include <bits/stdc++.h> 2 using namespace std; 3 bool ans[100010][4]; 4 bool vis[100010]; 5 int n,m,x; 6 long long trueans; 7 int main(){ 8 scanf("%d%d",&n,&m); 9 trueans=4+3*(n-2); 10 for(register int i=1;i<=m;i++){ 11 scanf("%d",&x),vis[x]=1;//2 12 if(vis[x+1]) ans[x+1][1]=1; 13 if(vis[x-1]) ans[x-1][3]=1; 14 } 15 for(register int i=1;i<=n;i++) 16 for(register int j=1;j<=3;j++) if(ans[i][j]) trueans--; 17 for(register int i=1;i<=n;i++) if(vis[i]) trueans--; 18 printf("%lld",trueans); 19 return 0; 20 }
T4
难题,数学题
思路:我们给等式两边同时乘上a[i]-a[j]然后暴力即可.....
1 #include <bits/stdc++.h> 2 using namespace std; 3 unsigned long long n,p,k; 4 unsigned long long a[3000010],b[3000010]; 5 unsigned long long ans,c; 6 bool vis[3000010]; 7 inline unsigned long long ksc(unsigned long long a,unsigned long long b,unsigned long long p){ 8 unsigned long long ret=0; 9 while(b){ 10 if(b&1) ret=(ret+a)%p; 11 a=(a+a)%p; 12 b>>=1; 13 } 14 return ret; 15 } 16 int main(){ 17 scanf("%lld%lld%lld",&n,&p,&k); 18 for(register int i=1;i<=n;i++) 19 { 20 scanf("%lld",&a[i]); 21 a[i]=(a[i]*a[i]%p*a[i]%p*a[i]-k*a[i]%p+p)%p; 22 } 23 sort(a+1,a+n+1); 24 for(int i=1;i<n;i++) 25 { 26 if(a[i]==a[i+1]) 27 { 28 c++; 29 30 ans+=c; 31 } 32 else 33 c=0; 34 35 } 36 printf("%lld",ans); 37 return 0; 38 }
由于后面的问题涉及玄学~~~
Error 404! ! !
end;