救命啊容斥出问题了
查看原帖
救命啊容斥出问题了
289056
北射天狼楼主2023/7/7 11:36

悬赏两个关注

#include <bits/stdc++.h>
#define int long long
using namespace std;
int a,b;
int num[15],sum[15],t[15];
int qpow(int x,int y){
	int k = 1;
	for (;y;y>>=1,x = x * x)
	    if (y & 1)
	        k = k * x;
	return k;
}
int calc(int x){
	memset(sum,0,sizeof(sum));
	int high = 0;
	for (int i=1;i<=11;x/=10,i++)	sum[i] = x % 10;
	for (int i = 11;i>=1;i--)
	    if (sum[i] != 0){
	    	high = i;
	    	break;
		}
	int ans = 0;
	for (int i=1;i<pow(3,11);i++){
		int cnt = 0,f = 1,qans = 0;
		memset(num,0,sizeof(num));
		for (int j=1;j<=11;j++)
		{ 
		    if (i % 3 == 1)    num[j] = 6,cnt++;
		    if (i % 3 == 2)	   num[j] = 8,cnt++;
		    i /= 3;
		}
		if (cnt % 2 == 0) f = -1;
		int q = high;
		while (num[q] && q >= 1){
			if (num[q] > sum[q]){
				return ans;
			} q--;
		} if (!q) {
			ans += f;
			continue;
		}
	    if (q == high)     qans = qans + (sum[q] - 1) * qpow(10,q - cnt - 1);
	    else qans = qans + sum[q] * qpow(10,q - cnt - 1);
	    if (num[q-1] > sum[q-1])
	        continue;
	    int pans = 1,flag = 1;
	    for (int j = q - 2;j >= 1;j--){
	    	if (num[j] > sum[j]){
	    		if (flag == 0){
	    			pans = pans / sum[j + 1] * (sum[j + 1] - 1);
	    			if (num[j] != 0)pans = pans * 10;
	    			flag = 1;
				} else {
					if (num[j] != 0)    pans = pans * 9;
				}
			} else 	if (num[j] != 0)    pans = pans * sum[j];
		}
		ans += f * (qans + pans);
	}
	return ans;
}
signed main()
{
	cin >> a >> b;
	cout << calc(b) - calc(a-1) << endl;
	return 0;
}
2023/7/7 11:36
加载中...