A - hzy 和 zsl 的生存挑战
这道题很有意思啊,在不知道答案的情况下很多人在比赛的时候可能会很着急就难以考虑到方方面面,其实只需要一个人说自己听到的数字,另一个人说与自己听到数字相反的数字,就一定能活下来。
这题就没必要附上代码了。
G - 简单数学题
这道题数据量很大,显然是需要推公式的。
我们将公式拆分开后,就会得到这样一个式子:
那么如何计算他们呢?这里就需要一些数学公式了
有了这个式子,上面就会变成
至于这个式子的运算,想必大家高中的时候就已经练得炉火纯青了吧
最后得到的公式是这样的:
(n - 1)*2^n + 1
#include<bits/stdc++.h>
using namespace std;
#define maxn 300005
#define ll long long
#define lll __int128
const int mod=1e9+7;
ll n;
ll poww(ll a,ll b){
ll ans=1,base=a%mod;
while(b!=0){
if(b&1!=0)ans=(ans*base)%mod;
base=(base*base)%mod;
b>>=1;
}
return ans%mod;
}
int main()
{
while(~scanf("%lld",&n)){
ll sum=(((n-1)%mod)*poww(2,n))%mod+1;
printf("%lld\n",sum%mod);
}
return 0;
}
B - 人类史上最大最好的希望事件
斐波那契螺旋线
就是经过的正方形的边长是按斐波那契数列排列的。这里我们开两个数组,一个存正方形的边长,一个存从0开始到a+b/4经过正方形的面积。预处理好这点应该就没什么问题了。
#include<bits/stdc++.h>
using namespace std;
#define maxn 50005
#define ll long long
const ll mod=192600817;
int t,a1,b1,a2,b2;
ll f[maxn],sum[maxn];
void init(){
f[0]=f[1]=1;
sum[0]=0;sum[1]=2;
for(int i=2;i<maxn;i++){
f[i]=(f[i-1]+f[i-2])%mod;
sum[i]=(sum[i-1]+f[i]*f[i]%mod)%mod;
}
}
int main()
{
init();
while(~scanf("%d",&t)){
while(t--){
scanf("%d %d %d %d",&a1,&b1,&a2,&b2);
int s1=4*a1+b1,s2=4*a2+b2;
if(s1>s2)swap(s1,s2);
if(s1!=0)printf("%lld\n",((sum[s2]-sum[s1]+mod)%mod+f[s1]*f[s1]%mod) % mod);
else printf("%lld\n",(sum[s2]-sum[s1]+mod)%mod);
}
}
return 0;
}
C - 超级无敌简单题