우 객 연습 경기 8 (1 ~ n 약수 와) (접두사 와 좋 은 문제) (가 변 연통 도) (용 척 원리)
n 을 주 고 1 부터 n 까지 의 모든 수의 약수 와 ~
입력 설명:
n
출력 설명:
,
예시 1
입력
3
출력
5
설명 하 다.
:
1 1 1
2 2 1,2
3 2 1,3
비고:
n <= 100000000
#include
int deal(int n)
{
int ans=0;
for(int i=1;i<=n;i++)
ans+=n/i;
return ans;
}
int main()
{
int n;
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
printf("%d
",deal(n));
return 0;
}
B
제목 설명
하나의 축 은 모든 저장 점 에 약간의 물건 이 있 을 뿐만 아니 라, 동시에 그것들 사이 에 거리 가 존재 한다.
매번 한 구간 [l, r] 에 게 이 구간 안의 모든 저장 점 의 물건 을 다른 저장 점 으로 운반 하 는 대 가 는 얼마 입 니까?
예 를 들 어 저장 점 i 에 x 개의 물건 이 있 는데 저장 점 j 로 운반 해 야 하고 대 가 는 x 이다. * dist( i , j )
dist 는 저장 점 간 의 거리 이다.
입력 설명:
第一行两个数表示n,m
第二行n-1个数,第i个数表示第i个储物点与第i+1个储物点的距离ai
第三行n个数,表示每个储物点的东西个数bi
之后m行每行三个数x l r
表示查询要把区间[l,r]储物点的物品全部运到储物点x的花费每次查询独立输出描述:
1000000007
예시 1
입력5 5 2 3 4 5 1 2 3 4 5 1 1 5 3 1 5 2 3 3 3 3 3 1 5 5
출력125 72 9 0 70
비고:对于100%的数据n,m <= 200000 , 0 <= ai,bi <= 2000000000
思路:
计算所有点到点1的距离以及前缀和,然后根据关系计算得到答案即可
另一种思路:计算前面所有点到 i 的权值和,但是不知道为什么一直错,找不到原因了
#include
#include
#include
using namespace std;
#define MAXN 200005
#define LL long long
#define mod 1000000007
int n,m;
LL a[MAXN],b[MAXN],s[MAXN];
void init(){
for(int i=2;i<=n;i++)
scanf("%lld",&a[i]),a[i]=(a[i]+a[i-1])%mod;
for(int i=1;i<=n;i++)
scanf("%lld",&b[i]),s[i]=(s[i-1]+a[i]*b[i])%mod,b[i]=(b[i]+b[i-1])%mod;
}
LL get_left(int l,int r,int x){
return a[x]*(b[r]-b[l-1])-(s[r]-s[l-1]);
}
LL get_right(int l,int r,int x){
return s[r]-s[l-1]-a[x]*(b[r]-b[l-1]);
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
while(m--)
{
int x,l,r;
scanf("%d%d%d",&x,&l,&r);
LL ans=0;
if(x>=r) ans=get_left(l,r,x);
else if(x<=l) ans=get_right(l,r,x);
else ans=get_left(l,x,x)+get_right(x,r,x);
printf("%lld
",(ans%mod+mod)%mod);
}
}
return 0;
}
D
제목 설명
하나 줄 게. n 시, m 한 변 의 무 방향 도 는 적어도 이것 을 바탕 으로 몇 개의 무 방향 변 을 더 해서 임의의 두 점 을 도달 할 수 있 도록 해 야 합 니까?
입력 설명:
n m 。
m , i 、 j , i j 。
출력 설명:
,
예시 1
입력
4 2
1 2
3 4
출력
1
비고:
100% , n,m<=100000。
연결 블록 에 ans 개가 있 으 면 ans - 1 을 출력 하면 됩 니 다.
dfs, bfs 를 이용 하여 구 할 수 있 습 니 다.
#include
#include
#include
using namespace std;
#define MAXN 100005
int father[MAXN],visit[MAXN];
int find_it(int x){
int tempx=x,t;
while(tempx!=father[tempx])
tempx=father[tempx];
while(father[x]!=x){
t=father[x];
father[x]=tempx;
x=t;
}
return tempx;
}
void unite(int num1,int num2){
int tx=find_it(num1);
int ty=find_it(num2);
if(tx!=ty)
father[tx]=ty;
}
int main()
{
int n,m,a,b;
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<=n;i++)
father[i]=i;
for(int i=0;i
E
제목 설명
집합 하나 와 수 m 를 제시 하 다.
집합 안에 n 개의 소수 가 있다.
제발 1 도착 하 다 m 의 모든 수 중에서 적어도 집합 중의 한 수 에 의 해 정 제 될 수 있 는 수의 개수.
입력 설명:
n m 。
n , 。
출력 설명:
, 。
예시 1
입력
3 37
5 7 13
출력
13
비고:
100% , n<=20,m 64 , <=1000000000
용 척 원리 처리
여기 서 n 개의 수 는 모두 질 수 이 므 로 우 리 는 직접 두 개의 수 를 곱 하여 최대 공약 수 를 얻 을 수 있 습 니 다. 만약 에 질 수 를 보장 하지 못 하면 최대 공약 수 를 요구 합 니 다.
왜냐하면 18 / 6 + 18 / 9. - 18 / lcm (6, 9) 정 답 이 맞습니다.
#include
#include
#include
using namespace std;
#define LL long long
LL a[100];
LL n,m,ans;
LL gcd(LL a,LL b)
{
return b?gcd(b,a%b):a;
}
LL lcm(LL a,LL b)
{
return a*b/gcd(a,b);
}
void dfs(int now,LL num,int sym)
{
if(num) ans+=m/num*sym;
for(int i=now+1;i<=n;i++)
dfs(i,lcm(num,a[i]),-1*sym);
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%lld%lld",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
ans=0;
for(int i=1;i<=n;i++)
dfs(i,a[i],1);
printf("%lld
",ans);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
두 손(조합수학+용척dp)컨베이어 문의 뜻 약술: (0,0)(0,0)(0,0)(0,0)(0,0)(e x,e y)(ex,ey)(ex,ey)(ex,ey)(0,0)(0,0)(0,0)(x,0)(x+ax+ax, y+ax, y+y)(x+ax+ax+ax...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.