Gym

题意:输入n,m,将n分段,每一段都可以被m整除,有多少种方法。
题解:找到n最多可以分成多少段,1段1中分法,2段2中分法,3段4种分法……计算可知若有x段则2^x-1种分法。
注意:如果n无法被m整除,那么它有0种分法。

#include <iostream>
#include <cstdio>
using namespace std;
char s[300010];
const int INF = 1e9+7;
int n,m,ans;
int KSM(int x)
{
    long long a,b;
    a = 1;
    b = 2;
    while(x)
    {
        if(x%2)
        {
            a *= b;
            a %= INF;
        }
        b *= b;
        b %= INF;
        x /= 2;
    }
    return a;
}

int f(int x)
{
    if(x>=n)
        return 1;
    int i,num;
    for(i=x;i<n;i++)
    {
        num *= 10;
        num += s[i] - '0';
        num %= m;
        if(num==0)
        {
            if(f(i+1))
            {

                ans++;
                return 1;
            }
        }
    }
    return 0;
}

int main()
{
    int num = 0,i;
    ans = 0;
    scanf("%d%d",&n,&m);
    scanf("%s",s);
    for(i=0;i<n;i++)
    {
        num *= 10;
        num += s[i] - '0';
        num %= m;
    }
    if(num==0)
    {
        f(0);
        printf("%d
",KSM(ans-1));
    }
    else
        printf("0
");

    return 0;
}
原文地址:https://www.cnblogs.com/luoxiaoyi/p/9770996.html