fxtoi 猜拳问题
题面传送门
对于这道题,我们很容易想到一个办法:搜索!你试试看
可是看到对于所有数据 \(n\leq4000000000\)应该就怂了。过不去!
细心观察 如果剪刀石头布三者都有,那么就会决不出胜负。
不不不不 还有一样我们没考虑 :每个人出的都一样!
那加个三不就好了!
#include<bits/stdc++.h>
using namespace std;
int n,t;
long long ans;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n)
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
if(i+j+k==n) ans++;
}
}
}
printf("%lld",ans);
ans=0;
}
return 0;
}
我们发现,有些循环是不必要的 于是我把他改了改
#include<bits/stdc++.h>
using namespace std;
int n,t;
long long ans;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n)
for(int i=1;i<=n;i++){
for(int j=1;j<=n-i-1;j++){
for(int k=1;k<=n-i-j;k++){
if(i+j+k==n) ans++;
}
}
}
printf("%lld",ans);
ans=0;
}
return 0;
}
但是,我仔细看了看又发现,可循环其实是没有必要的,因为我们可以控制\(j\)来去掉\(k\)。
#include<bits/stdc++.h>
using namespace std;
int n,t;
long long ans;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n)
for(int i=1;i<=n;i++){
for(int j=1;j<=n-i-1;j++){
ans++;
}
}
printf("%lld",ans);
ans=0;
}
return 0;
}
然后我又发现(发现真多) j的循环层数是固定的,于是可以再改改:
#include<bits/stdc++.h>
using namespace std;
int n,t;
long long ans;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n)
for(int i=1;i<=n;i++)ans+=n-i-1;
printf("%lld",ans);
ans=0;
}
return 0;
}
似乎很快 ,但\(O(NT)\)的复杂度还是过不去。似乎要变成\(O(T)\)或\(O(Tlog^2n)\)才行。
细看,恍然大悟,找到了\(O(T)\)的方法:\(ans\)加的是等差数列!
\(AC\)代码:
#include<bits/stdc++.h>
using namespace std;
unsigned long long n,ans,t;
int main(){
//freopen("a15.in","r",stdin);
//freopen("a15.out","w",stdout);
cin>>t;
while(t--){
scanf("%lld",&n);
printf("%lld\n",(n*n+3*n)/2+7);
}
return 0;
}
对了,有件事忘说了
\(n\)要加\(3\)
去好好看看题目,题目说什么?
那\(wangshengjun33\)与\(275307894a\)和\(A_rsj\)怎么办呢?
本出题人的一个小得意之处。