本学期浑浑噩噩,没学习也没刷题,可能是课程太多搞得脑子很混乱,什么也没学好,还不如学上学期一心刷题,考前突击= =
打算今天开始持续写题了,今天先找了套前几天的wannfly,A了前三题权当作练手了。
A-完全平方数. https://www.nowcoder.com/acm/contest/37/A
多次查询[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
对1e10以内的完全平方数打表,对于每次询问二分查找一下个数即可,注意'0'也是一个完全平方数。
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 vector<int>vi; 5 int ret(int k,int l,int r) 6 { 7 if(l>r) return 0; 8 if(k<vi[l]) return 0; 9 if(k>=vi[r]) return r-l+1; 10 int mid=l+(r-l)/2; 11 if(k<=vi[mid]){ 12 return ret(k,l,mid); 13 } 14 else{ 15 return mid-l+1+ret(k,mid+1,r); 16 } 17 } 18 int main() 19 { 20 int l,r,i,j,k,n,m; 21 for(i=0;i*i<=1000000000;i++)vi.push_back(i*i); 22 //while(cin>>k)cout<<ret(k,0,vi.size()-1)<<endl; 23 cin>>n; 24 int sz=vi.size()-1; 25 while(n--){ 26 scanf("%d%d",&l,&r); 27 printf("%d ",ret(r,0,sz)-ret(l-1,0,sz)); 28 } 29 return 0; 30 }
B-比赛
你在打比赛,这场比赛总共有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
预处理出来y[i](第i题写出的概率)和n[i](第i题未写出的概率)然后二进制枚举子集所有情况最后统计一下
1 #include<bits/stdc++.h> 2 using namespace std; 3 double dp[5005]; 4 int tot(int x){ 5 int res=0; 6 while(x){ 7 res+=(x&1); 8 x>>=1; 9 } 10 return res; 11 } 12 int main() 13 { 14 memset(dp,0,sizeof(dp)); 15 double a[12],b[12],c[12],y[12],n[12],ans[13]; 16 memset(ans,0,sizeof(ans)); 17 for(int i=0;i<12;++i) cin>>a[i]; 18 for(int i=0;i<12;++i) cin>>b[i]; 19 for(int i=0;i<12;++i) cin>>c[i]; 20 dp[0]=1; 21 for(int i=0;i<12;++i){ 22 n[i]=(1.00-a[i])*(1.00-b[i])*(1.00-c[i]); 23 y[i]=1-n[i]; 24 dp[0]*=n[i]; 25 } 26 // printf("%.12f ",dp[0]); 27 for(int i=1;i<(1<<12);i++){ 28 dp[i]=1.00; 29 for(int j=0;j<12;++j){ 30 if(i&(1<<j)) dp[i]*=y[j]; 31 else dp[i]*=n[j]; 32 } 33 } 34 for(int i=0;i<(1<<12);++i) 35 ans[tot(i)]+=dp[i]; 36 for(int i=0;i<13;++i) 37 printf("%.6f ",ans[i]); 38 return 0; 39 }
C-逆序对
求所有长度为n的01串中满足如下条件的二元组个数: 设第i位和第j位分别位ai和aj(i<j),则ai=1,aj=0。 答案对1e9+7取模。
输入描述:
输入一个n。
输出描述:
输出答案对1e9+7取模
示例1
输入
3
输出
6
说明
备注:
n <= 1e18
答案显然就是 2^(n-2)*n*(n-1)/2 mod 1e9+7,注意到n*(n-1)必定能除尽2,判定一下偶数是谁即可,注意中间别爆longlong
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 LL mod=1e9+7; 5 LL qpow(LL a,LL b){ 6 LL r=1; 7 for(;b;b>>=1,a=a*a%mod){ 8 if(b&1)r=r*a%mod; 9 } 10 return r; 11 } 12 int main() 13 { 14 LL n; 15 cin>>n; 16 if(n<=1){puts("0");return 0;} 17 LL r=qpow(2,n-2); 18 if(n%2==0){ 19 r=r*(n/2%mod)%mod*((n-1)%mod)%mod; 20 } 21 else{ 22 r=r*(n%mod)%mod*(((n-1)/2)%mod)%mod; 23 } 24 cout<<r<<endl; 25 return 0; 26 }