Wannafly挑战赛6

完全平方数
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

多次查询[l,r]范围内的完全平方数个数

定义整数x为完全平方数当且仅当可以找到整数y使得y*y=x

输入描述:

第一行一个数n表示查询次数
之后n行每行两个数l,r

输出描述:

对于每个查询,输出一个数表示答案
示例1

输入

5
1 3
1 4
2 4
4 4
1 1000000000

输出

1
2
1
1
31622

备注:

n <= 100000
0<= l <= r <= 1000000000

直接二分或者sqrt都没事的,我竟然维护错了端点,就是这个0的问题

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5;
ll a[N];
int main()
{
    for(int i=0;i<N;i++)
    a[i]=i*1LL*i;
    int T;
    scanf("%d",&T);
    while(T--)
    {
        ll l,r,cnt;
        cin>>l>>r;
        int pos=lower_bound(a,a+N,r)-a;
        cnt=pos;
        if(a[pos]!=r)cnt--;
        pos=lower_bound(a,a+N,l)-a;
        cnt-=pos;
        if(pos)
        {if(a[pos-1]!=l)cnt++;}
        else cnt++;
        cout<<cnt<<endl;
    }
    return 0;
}
比赛
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

你在打比赛,这场比赛总共有12个题

对于第i个题,你的队伍有a[i]的几率解决她

如果解决不了她呢?

由于所有人讨论的都很大声

所以你有b[i]的概率从左边那个队那里听会这个题的做法

有c[i]的概率从右边那个队那里听会这个题的做法

请问最终你们队伍解出0-12题的概率分别是多少

输入描述:

第一行12个数表示a[1] -> a[12]
第二行12个数表示b[1] -> b[12]
第三行12个数表示c[1] -> c[12]

输出描述:

输出13行,第i行表示解出i-1题的概率
保留6位小数
示例1

输入

0.20 0.30 0.37 0.40 0.45 0.50 0.57 0.60 0.75 0.76 0.77 0.83
0.85 0.88 0.90 0.94 0.100 0.104 0.105 0.107 0.115 0.120 0.122 0.125
0.128 0.130 0.134 0.140 0.149 0.150 0.152 0.155 0.170 0.183 0.203 0.240

输出

0.000000
0.000000
0.000000
0.000011
0.000160
0.001508
0.009620
0.041938
0.124153
0.243773
0.301960
0.212453
0.064424

这个题目挺好的啊,复习了概率,我发现我这个学的不太行啊

#include<bits/stdc++.h>
using namespace std;
double a[15],b[15],c[15];
double dp[15][15];
int main()
{
    for(int i=1;i<=12;i++)
        cin>>a[i];
    for(int i=1;i<=12;i++)
        cin>>b[i];
    for(int i=1;i<=12;i++)
        cin>>c[i];
    dp[0][0]=1;
    for(int i=1;i<=12;i++)
    for(int j=0;j<=12;j++)
    {
      dp[i][j]=dp[i-1][j]*(1.-a[i]-(1.-a[i])*(b[i]+c[i]-b[i]*c[i]));
    if(j)dp[i][j]+=dp[i-1][j-1]*(a[i]+(1.-a[i])*(b[i]+c[i]-b[i]*c[i]));
    }
    for(int i=0;i<=12;i++)
    {
        if(dp[12][i]<0)printf("0.000000\n");
        else printf("%.6f\n",dp[12][i]);
    }
    return 0;
}
逆序对
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

求所有长度为n的01串中满足如下条件的二元组个数:
设第i位和第j位分别位ai和aj(i<j),则ai=1,aj=0。
答案对1e9+7取模。

输入描述:

输入一个n。

输出描述:

输出答案对1e9+7取模
示例1

输入

3

输出

6

说明


 

备注:

 n <= 1018

我写了暴力,得到的这个字符串0 0  1 6 13啥的,找到了答案是n*(n+1)*2^(n-2,可是我的代码爆了ll啊,奇妙用了int128过的,之后我看到我没有及时取模

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MD=1e9+7;
ll n;
ll poww(ll x, ll n)
{
    ll ans=1;
    while(n)
    {
        if(n&1)ans=ans*x%MD;
        x=x*x%MD;
        n>>=1;
    }
    return ans;
}
int main()
{
    while(cin>>n)
    {
        n--;
        if(n<=0)printf("0");
        else if(n==1)printf("1");
        else
            cout<<poww(2,n-2)*(n%MD)%MD*((n+1)%MD)%MD;
    }
    return 0;
}
双拆分数
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
Special Judge, 64bit IO Format: %lld

题目描述

对于一个数字串 s,若能找到一种将其分成左右两个非空部分 s1,s2 的方案,使得:
    1、s1,s2 均无前导零
    2、存在两个正整数 a,b,使得 b 整除 a,且 a/b=s1, a*b=s2
那么我们记这是一个合法的分法。特别地,如果一个串有两个或更多个不同的合法的分法,那么我们称这个数字串是双拆分数字串。
给定一个 n,要求构造一个长度恰为 n 的双拆分数字串。如果无解,输出 -1。

输入描述:

输入仅一行一个正整数 n(1 <= n <= 300)。

输出描述:

仅一行一个数字串或者 -1。
示例1

输入

8

输出

24419764

构造题,这个人想的这个特殊值好牛逼啊,佩服,我这种lowbi只能找到输出-1的

#include <cstdio>
int main()
{
    int n;
    scanf("%d",&n);
    if(n<=3) puts("-1");
    else
    {
        if(!(n&1))printf("1144"),n-=4;
        else printf("16400"),n-=5;
        while(n--) printf("0");
    }
    return 0;
}

 

posted @ 2017-12-23 21:38  暴力都不会的蒟蒻  阅读(527)  评论(0编辑  收藏  举报