【Wannafly挑战赛6】 A B C E

22 篇文章 0 订阅
15 篇文章 0 订阅

A 完全平方数
时间限制: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

#include<bits/stdc++.h>
using namespace std;
#define LL  long long
const int MAXN = 1e5 ;
const int MAXM = 1e6 ;
int cnt(int x){
    if(x<0) return 0;
    else return int(sqrt(x*1.0))+1;
}
int main(){
    int T;scanf("%d",&T);
    while(T--){
        int a,b;scanf("%d%d",&a,&b);
        printf("%d\n",cnt(b)-cnt(a-1));
    }
return 0;
}

B 比赛
时间限制: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;
#define LL  long long
const int MAXN = 100 ;
const int MAXM = 1e6 ;

double a[MAXN],b[MAXN],c[MAXN];
double win[MAXN],lose[MAXN];
double ans[MAXN];
int main(){
    int n=12;
    for(int i=0;i<n;i++) scanf("%lf",&a[i]);
    for(int i=0;i<n;i++) scanf("%lf",&b[i]);
    for(int i=0;i<n;i++) scanf("%lf",&c[i]);

    for(int i=0;i<n;i++){
        lose[i]=(1-a[i])*(1-b[i])*(1-c[i]);
        win[i]=1-lose[i];
    }
    for(int i=0;i<(1<<12);i++){
        int cnt=0; double s=1;
        for(int j=0;j<12;j++){
            if((i>>j)&1){
                cnt++; s*=win[j];
            }else s*=lose[j];
        }
        ans[cnt]+=s;
    }
    for(int i=0;i<=12;i++){
        printf("%.6lf\n",ans[i]);
    }
return 0;
}

C 逆序对
题解链接

E 双拆分数
时间限制: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
分析: 构造题目。
根据式子 ,合并一下。 b=a/s1 .===》 a^2 = s1*s2 (注意左部分为s1,右部分为s2 , 同时 s1 | a )
想一下,如果找到了奇数长度的一个数字合适,那么对于下一个奇数,只需要末尾加两个00就可以了。同理偶数长度的也一样。
n<=3 不成立。
然后我们就找第一个偶数长度的4,只要能够找到一个符合的之后的偶数就都可以解决 ,这个数有什么特征呢? 可以从中间找一个位置将其分成两个部分,左边和右边数相乘为平方数。 这样的位置至少有两个。然后就可以找到1144 。
同理第一个奇数的5,一个道理。可以找到16400。

代码

#include<bits/stdc++.h>
using namespace std;
#define LL  long long

const int MAXN = 100 ;
const int MAXM = 1e6 ;
const int mod = 1e9+7;

int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        if(n<=3) puts("-1");
        else {
            if(n&1) {
                printf("16400");
                for(int i=n-5;i>=1;i--){
                    printf("0");
                }
            }else {
                printf("1144");
                for(int i=n-4;i>=1;i--)
                    printf("0");
            }
        }
        puts("");
    }
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值