首页 > 其他分享 >Codeforces Round #450 (Div. 2) D. Unusual Sequences 数学

Codeforces Round #450 (Div. 2) D. Unusual Sequences 数学

时间:2023-04-24 22:37:40浏览次数:40  
标签:Unusual 450 ll ans Codeforces long int sequences include


Count the number of distinct sequences a1, a2, …, an (1 ≤ ai) consisting of positive integers such that gcd(a1, a2, …, an) = x and . As this number could be large, print the answer modulo 109 + 7.

gcd here means the greatest common divisor.

Input
The only line contains two positive integers x and y (1 ≤ x, y ≤ 109).

Output
Print the number of such sequences modulo 109 + 7.

Examples
inputCopy
3 9
outputCopy
3
inputCopy
5 8
outputCopy
0
Note
There are three suitable sequences in the first test: (3, 3, 3), (3, 6), (6, 3).

There are no suitable sequences in the second test.

第一次接触这种数学题,还是自己数学太菜了。。。
这里用容斥原理就好了,(详细的话看其他的博客吧,有时间再更

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<set>
#include<queue>
#include<map>
#include<cmath>
using namespace std;
#define maxn 1000005
#define inf 0x3f3f3f3f
typedef long long ll;
typedef unsigned long long int ull;
#define eps 1e-5
typedef pair<int,int> pii;
const ll mod=1e9+7;
ll qpow(ll a,ll b)
{
    ll ans=1;
    while(b){
        if(b%2)ans=ans*a%mod;
        b=b/2;
        a=a*a%mod;
    }
    return ans;
}

ll a[maxn];
ll dp[maxn];

int main()
{
    ios::sync_with_stdio(false);
    ll n,m;
    cin>>n>>m;
    int cnt=0;
    if(m%n){
        cout<<0<<endl;
    }
    else {
        for(ll i=1;i<=sqrt(m);i++){
            if(m%i==0){
                if(i%n==0)a[++cnt]=i;
                if(i*i!=m&&m/i%n==0)a[++cnt]=m/i;
            }
        }
        sort(a+1,a+cnt+1);
        for(int i=cnt;i>=1;i--){
            dp[i]=qpow(2,m/a[i]-1);
            for(int j=i+1;j<=cnt;j++){
                if(a[j]%a[i]==0){
                    dp[i]=((dp[i]-dp[j])%mod+mod)%mod;
                }
            }
        }
        cout<<dp[1]<<endl;
    }
}


标签:Unusual,450,ll,ans,Codeforces,long,int,sequences,include
From: https://blog.51cto.com/u_15657999/6221933

相关文章

  • Codeforces Round #272 (Div. 2) D. Dreamoon and Sets 数学
    Dreamoonlikestoplaywithsets,integersand.isdefinedasthelargestpositiveintegerthatdividesbothaandb.LetSbeasetofexactlyfourdistinctintegersgreaterthan0.DefineStobeofrankkifandonlyifforallpairsofdistinctelemen......
  • Codeforces Round #308 (Div. 2) E. Vanya and Brackets
    Vanyaisdoinghismathshomework.Hehasanexpressionofform,wherex1, x2, …, xnaredigitsfrom1to9,andsignrepresentseitheraplus‘+’orthemultiplicationsign‘*’.Vanyaneedstoaddonepairofbracketsinthisexpressionsothattoma......
  • Educational Codeforces Round 147
    A题意思路有前导零结果直接为0,出现在第一位的?贡献为9,其他地方的?贡献为10。代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;chars[10];intmain(){intT;scanf("%d",&T);while(T--){scanf("%s",s);......
  • Educational Codeforces Round 147 (Rated for Div. 2)
    题目链接B核心思路真的需要加强了,看到这个最大值和最小值我们其实也需要往对应的最大值和最小值的相关操作去想,不如前缀最小值/前缀最大值或者是后缀最小值/后缀最大值。这里一个比较直接的想法就是想找到不同的地方,然后看不可以扩展。那么怎么看是否可以扩展呢,如果是左边的话......
  • Educational Codeforces Round 127 (Rated for Div. 2)
    题目链接D核心思路首先挖掘下操作的性质吧:x>1&&x+3<10:1xx+1x+2x+310我们可以发现这样子好像对于我们的结果是没有影响的,答案还是9.所以这个性质就挖掘出来了啊,只要我们把一段连续的插入到对应的区间里面就好了。也就是只要这个区间的左端点小于插入连续的数的最小值,......
  • Codeforces Beta Round 96 (Div. 1) -- C. Logo Turtle (dp,记忆化搜索)
    记忆化搜索就是暴力,多一步优化,走过的路别走了。说实话,可能是数据水了,居然能过。constintN=510;strings;intn,ans;boolst[501][501][2][50];voiddfs(intx,intidx,intdir,intk){ if(st[x][idx][dir][k])return; st[x][idx][dir][k]=1;//走过的路不走......
  • Educational Codeforces Round 147 (A-D)
    A.Matching橘子熊:这题太简单了我不想写题面Description给定给一个带问号的字符串,求有多少种可能的数字Input多次询问,一次一个字符串Output对于每次询问,输出可能的数字的总数数据范围与约定2e5次询问,单词询问不超过5个字符思路主要思路签到题大部分情况下,一个......
  • Educational Codeforces Round 39 (Rated for Div. 2) -- D. Timetable (DP)
    写得很折磨人,每次dp都写个一个多小时,写出来明明觉得不难.题目大意:可以进行K次操作,把删除1,进行k次操作后每行第一个1和最后一个1的位置相减的绝对值加1得到的结果最小。做法:每次肯定是要从左删或者从右边删,然后顺着这个思路,先把每行的进行小于等于k次操作时,每行最小......
  • codeforces 559C Gerald and Giant Chess(dp+组合数学)
    题目链接:codeforces559C题目大意:给出一个h*r的矩阵,从左上角走到右下角,中间有一些点不能经过,问不同的路径有多少种?题目分析:首先我们考虑一个n*m的矩阵,从左上角只能向右或向下走能走到右下角的方案数,也就是C(n+m,n),就是一共要走n+m次,选出n次横着走。那么我们定义dp[i]表示在前不经......
  • codeforces 545C C. Woodcutters(dp+二分)
    题目链接:codeforces545C题目大意:给出一些树的位置和高度,每棵树可以砍倒,覆盖[xi−hi,xi]或者覆盖[xi,xi+hi],或者不砍倒,问最多砍倒多少棵树?题目分析:我们记录dp[i]表示选取到i棵树的时候用的最短的区间长度。每次枚举每棵树,二分到最大的不超过当前树位置的个数,然后利用当前树的信息......