問題解——牛客網OI試合制テスト試合2
21169 ワード
T1
法則問題.
全部選んでからやり直すことを考えればいい#include
#include
#include
#include
using namespace std;
int barrel[10010]={
0};
int main(){
int T;
scanf("%d",&T);
for(int tt=1;tt<=T;tt++){
int cnta=0,cntb=0,cnt=0,ans=0;
int a,b;
scanf("%d %d",&a,&b);
for(int i=1;i<=sqrt(a);i++){
if(a%i==0){
if(i!=a/i){
barrel[i]=tt;
barrel[a/i]=tt;
cnta+=2;
}
else{
barrel[i]=tt;
cnta+=1;
}
}
}
// printf("%d
",cnta);
for(int i=1;i<=sqrt(b);i++){
if(b%i==0){
if(i!=b/i){
cntb+=2;
}
else{
cntb+=1;
}
if(i!=b/i){
if(barrel[i]==tt){
cnt++;}
if(barrel[b/i]==tt){
cnt++;}}
else{
if(barrel[i]==tt){
cnt++;}
}
}
}
// printf("%d
",cnt);
ans+=cnta*cntb-(cnt)*(cnt-1)/2;
printf("%d
",ans);
}
return 0;
}
T2
科学技術の問題
試験の時、閉包を伝えるブラックテクノロジーがあることを全く知らなかった.
例えば(a)と(b)がつながっているかどうかを解決できます.
(a)から(b)までkの長さのパスが何本あるかの問題
Floydとマトリックス高速べき乗の2つの解法があります
おもしろい
そしてlong longを覚えています#include
#include
#include
#include
#define int long long
using namespace std;
int n,k;
struct Matrix{
static const int MAXN = 100;
int alpha[MAXN][MAXN];
int n,m;
void init2(void){
for(int i=0;i)
for(int j=0;j)
alpha[i][j]=0;
n=m=0;
}
void init(int x){
for(int i=1;i<=x;i++)
alpha[i][i]=1;
n=m=x;
}
Matrix operator *(Matrix b){
Matrix tmp;
tmp.init2();
for(int i=1;i<=n;i++)
for(int j=1;j<=b.m;j++)
for(int k=1;k<=m;k++)
tmp.alpha[i][j]+=alpha[i][k]*b.alpha[k][j];
tmp.n=n;
tmp.m=b.m;
return tmp;
}
};
Matrix pow(Matrix a,int p){
Matrix ans;
ans.init2();
ans.init(a.n);
while(p){
if(p&1)
ans=ans*a;
a=a*a;
p>>=1;
}
return ans;
}
signed main(){
scanf("%lld %lld",&n,&k);
Matrix a;
a.init2();
a.m=a.n=n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%lld",&a.alpha[i][j]);
Matrix b=pow(a,k);
printf("%lld",b.alpha[1][n]);
return 0;
}
T3
単調なスタックの経典の応用、手当たり次第に1ヤードでいいです#include
#include
#include
#include
using namespace std;
struct Node{
int pos,x;
};
stack S;
int a[10010],n,b[10010];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
while((!S.empty())&&a[i]>S.top().x){
b[S.top().pos]=i;
S.pop();
}
S.push(Node{i,a[i]});
}
while(!S.empty()){
b[S.top().pos]=0;
S.pop();
}
for(int i=1;i<=n;i++)
printf("%d ",b[i]);
return 0;
}
T4
目を丸くして浮気率OR玄学を証明しますか?
法則問題でもあります
覚えてるlong long#include
#include
#include
#include
#define int long long
using namespace std;
int n;
signed main(){
scanf("%lld",&n);
if(n==1)
printf("1");
else
printf("%lld",(int)sqrt(n) );
return 0;
}
T5
けっていもんだい
スキャンしてどれだけ不一致があるかを統計すればいいです#include
#include
#include
using namespace std;
int l=0,rno=0,n;
bool get(void){
char c=getchar();
while(c!='('&&c!=')')
c=getchar();
if(c=='(')
return true;
else
return false;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
if(get()){
l+=1;
}
else{
if(l)
l--;
else
rno++;
}
}
if(rno==0)
printf("0");
else
printf("%d",(rno%2)?(rno/2+1):(rno/2));
return 0;
}
T6
答えを提出したようですか?
手動の2分+Rubyは階乗の時計qwqを求めます
もう一つ間違えた#include
#include
#include
#include <string>
#include
using namespace std;
long long n;
int main(){
cin>>n;
if(n==7)
printf("10
");
if(n==77)
printf("94
");
if(n==777)
printf("892
");
if(n==7777)
printf("8640
");
if(n==77777)
printf("84657
");
if(n==777777)
printf("834966
");
if(n==7777777)
printf("8267019
");
if(n==77777777)
printf("82052137
");
if(n==777777777)
printf("815725636
");
if(n==7777777777)
printf("8118965902
");
return 0;
}
転載先:https://www.cnblogs.com/dreagonm/p/9605535.html
#include
#include
#include
#include
using namespace std;
int barrel[10010]={
0};
int main(){
int T;
scanf("%d",&T);
for(int tt=1;tt<=T;tt++){
int cnta=0,cntb=0,cnt=0,ans=0;
int a,b;
scanf("%d %d",&a,&b);
for(int i=1;i<=sqrt(a);i++){
if(a%i==0){
if(i!=a/i){
barrel[i]=tt;
barrel[a/i]=tt;
cnta+=2;
}
else{
barrel[i]=tt;
cnta+=1;
}
}
}
// printf("%d
",cnta);
for(int i=1;i<=sqrt(b);i++){
if(b%i==0){
if(i!=b/i){
cntb+=2;
}
else{
cntb+=1;
}
if(i!=b/i){
if(barrel[i]==tt){
cnt++;}
if(barrel[b/i]==tt){
cnt++;}}
else{
if(barrel[i]==tt){
cnt++;}
}
}
}
// printf("%d
",cnt);
ans+=cnta*cntb-(cnt)*(cnt-1)/2;
printf("%d
",ans);
}
return 0;
}
科学技術の問題
試験の時、閉包を伝えるブラックテクノロジーがあることを全く知らなかった.
例えば(a)と(b)がつながっているかどうかを解決できます.
(a)から(b)までkの長さのパスが何本あるかの問題
Floydとマトリックス高速べき乗の2つの解法があります
おもしろい
そしてlong longを覚えています
#include
#include
#include
#include
#define int long long
using namespace std;
int n,k;
struct Matrix{
static const int MAXN = 100;
int alpha[MAXN][MAXN];
int n,m;
void init2(void){
for(int i=0;i)
for(int j=0;j)
alpha[i][j]=0;
n=m=0;
}
void init(int x){
for(int i=1;i<=x;i++)
alpha[i][i]=1;
n=m=x;
}
Matrix operator *(Matrix b){
Matrix tmp;
tmp.init2();
for(int i=1;i<=n;i++)
for(int j=1;j<=b.m;j++)
for(int k=1;k<=m;k++)
tmp.alpha[i][j]+=alpha[i][k]*b.alpha[k][j];
tmp.n=n;
tmp.m=b.m;
return tmp;
}
};
Matrix pow(Matrix a,int p){
Matrix ans;
ans.init2();
ans.init(a.n);
while(p){
if(p&1)
ans=ans*a;
a=a*a;
p>>=1;
}
return ans;
}
signed main(){
scanf("%lld %lld",&n,&k);
Matrix a;
a.init2();
a.m=a.n=n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%lld",&a.alpha[i][j]);
Matrix b=pow(a,k);
printf("%lld",b.alpha[1][n]);
return 0;
}
T3
単調なスタックの経典の応用、手当たり次第に1ヤードでいいです#include
#include
#include
#include
using namespace std;
struct Node{
int pos,x;
};
stack S;
int a[10010],n,b[10010];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
while((!S.empty())&&a[i]>S.top().x){
b[S.top().pos]=i;
S.pop();
}
S.push(Node{i,a[i]});
}
while(!S.empty()){
b[S.top().pos]=0;
S.pop();
}
for(int i=1;i<=n;i++)
printf("%d ",b[i]);
return 0;
}
T4
目を丸くして浮気率OR玄学を証明しますか?
法則問題でもあります
覚えてるlong long#include
#include
#include
#include
#define int long long
using namespace std;
int n;
signed main(){
scanf("%lld",&n);
if(n==1)
printf("1");
else
printf("%lld",(int)sqrt(n) );
return 0;
}
T5
けっていもんだい
スキャンしてどれだけ不一致があるかを統計すればいいです#include
#include
#include
using namespace std;
int l=0,rno=0,n;
bool get(void){
char c=getchar();
while(c!='('&&c!=')')
c=getchar();
if(c=='(')
return true;
else
return false;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
if(get()){
l+=1;
}
else{
if(l)
l--;
else
rno++;
}
}
if(rno==0)
printf("0");
else
printf("%d",(rno%2)?(rno/2+1):(rno/2));
return 0;
}
T6
答えを提出したようですか?
手動の2分+Rubyは階乗の時計qwqを求めます
もう一つ間違えた#include
#include
#include
#include <string>
#include
using namespace std;
long long n;
int main(){
cin>>n;
if(n==7)
printf("10
");
if(n==77)
printf("94
");
if(n==777)
printf("892
");
if(n==7777)
printf("8640
");
if(n==77777)
printf("84657
");
if(n==777777)
printf("834966
");
if(n==7777777)
printf("8267019
");
if(n==77777777)
printf("82052137
");
if(n==777777777)
printf("815725636
");
if(n==7777777777)
printf("8118965902
");
return 0;
}
転載先:https://www.cnblogs.com/dreagonm/p/9605535.html
#include
#include
#include
#include
using namespace std;
struct Node{
int pos,x;
};
stack S;
int a[10010],n,b[10010];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
while((!S.empty())&&a[i]>S.top().x){
b[S.top().pos]=i;
S.pop();
}
S.push(Node{i,a[i]});
}
while(!S.empty()){
b[S.top().pos]=0;
S.pop();
}
for(int i=1;i<=n;i++)
printf("%d ",b[i]);
return 0;
}
目を丸くして浮気率OR玄学を証明しますか?
法則問題でもあります
覚えてるlong long
#include
#include
#include
#include
#define int long long
using namespace std;
int n;
signed main(){
scanf("%lld",&n);
if(n==1)
printf("1");
else
printf("%lld",(int)sqrt(n) );
return 0;
}
T5
けっていもんだい
スキャンしてどれだけ不一致があるかを統計すればいいです#include
#include
#include
using namespace std;
int l=0,rno=0,n;
bool get(void){
char c=getchar();
while(c!='('&&c!=')')
c=getchar();
if(c=='(')
return true;
else
return false;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
if(get()){
l+=1;
}
else{
if(l)
l--;
else
rno++;
}
}
if(rno==0)
printf("0");
else
printf("%d",(rno%2)?(rno/2+1):(rno/2));
return 0;
}
T6
答えを提出したようですか?
手動の2分+Rubyは階乗の時計qwqを求めます
もう一つ間違えた#include
#include
#include
#include <string>
#include
using namespace std;
long long n;
int main(){
cin>>n;
if(n==7)
printf("10
");
if(n==77)
printf("94
");
if(n==777)
printf("892
");
if(n==7777)
printf("8640
");
if(n==77777)
printf("84657
");
if(n==777777)
printf("834966
");
if(n==7777777)
printf("8267019
");
if(n==77777777)
printf("82052137
");
if(n==777777777)
printf("815725636
");
if(n==7777777777)
printf("8118965902
");
return 0;
}
転載先:https://www.cnblogs.com/dreagonm/p/9605535.html
#include
#include
#include
using namespace std;
int l=0,rno=0,n;
bool get(void){
char c=getchar();
while(c!='('&&c!=')')
c=getchar();
if(c=='(')
return true;
else
return false;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
if(get()){
l+=1;
}
else{
if(l)
l--;
else
rno++;
}
}
if(rno==0)
printf("0");
else
printf("%d",(rno%2)?(rno/2+1):(rno/2));
return 0;
}
答えを提出したようですか?
手動の2分+Rubyは階乗の時計qwqを求めます
もう一つ間違えた
#include
#include
#include
#include <string>
#include
using namespace std;
long long n;
int main(){
cin>>n;
if(n==7)
printf("10
");
if(n==77)
printf("94
");
if(n==777)
printf("892
");
if(n==7777)
printf("8640
");
if(n==77777)
printf("84657
");
if(n==777777)
printf("834966
");
if(n==7777777)
printf("8267019
");
if(n==77777777)
printf("82052137
");
if(n==777777777)
printf("815725636
");
if(n==7777777777)
printf("8118965902
");
return 0;
}
転載先:https://www.cnblogs.com/dreagonm/p/9605535.html